Aguarde o processo terminar async e, em seguida, chamar uma função dentro do formulário principal
Eu estou codificando um editor para um jogo com C #. Meu programa é aberto como arquivo .txt iniciando um processo notepad.exe. Se esse processo sair, eu quero chamar uma função dentro do formulário principal (para atualizar a caixa de texto). Aqui está o que estou fazendo até agora:
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;
}
A função GetRealPathByNode () retorna uma string do caminho completo do arquivo para o qual o nó TreeView aponta. DisplayText () lê o texto do arquivo em que o nó aponta e exibe em um richtextbox.
Ao executar, meu formulário principal ainda é utilizável como eu queria, mas quando o processo é finalizado (notepad fechado), ele lança um erro informando que a função NotePadHasEnded não tem acesso ao objeto treeView1 porque está sendo executado em outro processo.
Como posso criar um processo que chama uma função no meu formulário principal quando ele está sendo encerrado de forma assíncrona? Eu sei que ele funciona quando eu uso a função WaitForExit (), mas meu formulário congela e aguarda até que o bloco de notas seja fechado. Eu quero que o usuário consiga abrir outros arquivos txt com o editor e quando um editor está sendo fechado que o texto richtextbox está sendo atualizado na minha GUI.
/Editar/ Agora resolvido. Graças à resposta de Woodman, eu substituí
editor.Exited += delegate {
NotePadHasEnded(node);
};
com
editor.Exited += delegate
{
this.Invoke((MethodInvoker)delegate()
{
NotePadHasEnded(node);
});
};