Warten Sie, bis der Prozess asynchron beendet ist, und rufen Sie dann eine Funktion im Hauptformular auf

Ich programmiere einen Editor für ein Spiel mit C #. Mein Programm wird als TXT-Datei geöffnet, indem ein notepad.exe-Prozess gestartet wird. Wenn dieser Prozess beendet wird, möchte ich eine Funktion im Hauptformular aufrufen (um das Textfeld zu aktualisieren). Folgendes mache ich bisher:

 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;
    }

Die Funktion GetRealPathByNode () gibt eine Zeichenfolge des vollständigen Pfads der Datei zurück, auf die der TreeView-Knoten zeigt. DisplayText () liest den Text aus der Datei, auf die der Knoten zeigt, und zeigt ihn in einem Richtextfeld an.

Während der Ausführung kann mein Hauptformular immer noch so verwendet werden, wie ich es wollte. Wenn der Prozess jedoch beendet wird (Editor geschlossen), wird der Fehler ausgegeben, dass die Funktion NotePadHasEnded keinen Zugriff auf das treeView1-Objekt hat, da sie in einem anderen Prozess ausgeführt wird.

Wie kann ich einen Prozess erstellen, der eine Funktion in meinem Hauptformular aufruft, wenn sie asynchron beendet wird? Ich weiß, dass es funktioniert, wenn ich die WaitForExit () -Funktion verwende, aber dann friert mein Formular ein und wartet, bis der Editor geschlossen wird. Ich möchte, dass der Benutzer andere txt-Dateien mit dem Editor öffnen kann und wenn ein Editor geschlossen wird, wird der richtextbox-Text in meiner GUI aktualisiert.

/Bearbeiten/ Jetzt gelöst. Dank Woodmans Antwort ersetzte ich

            editor.Exited += delegate {
            NotePadHasEnded(node);
            };

mit

  editor.Exited += delegate
        {
            this.Invoke((MethodInvoker)delegate()
            {
                NotePadHasEnded(node);
            });
        };

Antworten auf die Frage(3)

Ihre Antwort auf die Frage