Подождите, пока процесс завершит асинхронную работу, а затем вызовите функцию в главной форме
Я пишу редактор для игры с C #. Моя программа открывается как файл .txt, запуская процесс notepad.exe. Если этот процесс завершается, я хочу вызвать функцию в главной форме (чтобы обновить текстовое поле). Вот что я делаю до сих пор:
void OpenTextEditor(TreeNode node)
{
Process editor = new Process();
editor.StartInfo.WorkingDirectory = "%WINDIR%";
editor.StartInfo.FileName = "notepad.exe";
var txtfilelocation = GetRealPathByNode(node);
var txtfile = File.ReadAllText(txtfilelocation,Encoding.Default);
txtfile = txtfile.Replace("\n", "\r\n");
File.WriteAllText(txtfilelocation,txtfile,Encoding.Default);
editor.StartInfo.Arguments = txtfilelocation;
editor.EnableRaisingEvents = true;
editor.Exited += delegate {
NotePadHasEnded(node);
};
editor.Start(); //starten
}
public Delegate NotePadHasEnded(TreeNode node)
{
var txtfilelocation = GetRealPathByNode(node);
var newfileloc = txtfilelocation;
var newfile = File.ReadAllText(newfileloc, Encoding.Default);
newfile = newfile.Replace("\r\n", "\n");
File.WriteAllText(txtfilelocation, newfile, Encoding.Default);
if (treeView1.SelectedNode == node) DisplayText(node);
return null;
}
Функция GetRealPathByNode () возвращает строку полного пути к файлу, на который указывает узел TreeView. DisplayText () читает текст из файла, на который указывает узел, и отображает его в richtextbox.
После выполнения моя основная форма все еще пригодна для использования, как я и хотел, но когда процесс завершается (блокнот закрыт), он выдает ошибку, в которой говорится, что функция NotePadHasEnded не имеет доступа к объекту treeView1, поскольку выполняется в другом процессе.
Как я могу создать процесс, который вызывает функцию в моей основной форме при ее выходе, асинхронно? Я знаю, что это работает, когда я использую функцию WaitForExit (), но тогда моя Форма зависает и ждет, пока блокнот закроется. Я хочу, чтобы пользователь мог открывать другие текстовые файлы с помощью редактора, и когда один редактор закрывается, текст richtextbox не обновляется в моем графическом интерфейсе.
/редактироватьТеперь решено. Благодаря ответу Вудмана я заменил
editor.Exited += delegate {
NotePadHasEnded(node);
};
с участием
editor.Exited += delegate
{
this.Invoke((MethodInvoker)delegate()
{
NotePadHasEnded(node);
});
};