Hallo Entwickler,
bin neu im Forum und auch recht neu in der C# Programmierung, versuche mir viel über die MSDN (schön das es sowas gibt) und auch über die openBooks / Forums anzueignen. Betreibe dies gerade ein wenig in meiner Freizeit und finde C# ist echt ganz schick
Nun habe aktuell das Problem, dass mein WinForm welches ein Process startet sich nicht beendet lässt, wenn der gestartete Process geschlossen wird und das Exited Event gefeuerert wird.
In dem WinForm habe ich ein Close Button, welcher den Prozess beendet (Anhand der übergebenen ID) das funktioniert.
Ich möchte aber auch darauf regaieren, der Externe Process geschlossen wird (rotes X

) - so dass sich das WinForm ebenfalls beendet. Das WinForm hier wird mittels ShowDialog() von meiner Form1 (Main) aufgerufen.
Als Fehlermeldung kommt immer:
Zitat: |
Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement fConsole erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde. |
So genug gequatscht hier der Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| public partial class fConsole : Form { public int ID { get; set; } private bool exited = false; private void start() { Process myProcess = new Process(); ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "Notepad.exe"; processInfo.UseShellExecute = false; processInfo.RedirectStandardOutput = true; processInfo.CreateNoWindow = true;
myProcess.EnableRaisingEvents = true; myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcess_OutputDataReceived); myProcess.Exited += new EventHandler(myProcess_Exited); myProcess.StartInfo = processInfo; myProcess.Start(); ID = myProcess.Id; myProcess.BeginOutputReadLine(); } private void myProcess_Exited(object sender, System.EventArgs e) { if (!exited) { exited = true; this.Close(); } } private void btClose_Click(object sender, EventArgs e) { kill(); DialogResult = DialogResult.Cancel; this.Close(); } private void kill() { try { exited = true; Process p = Process.GetProcessById(ID); p.Kill(); } catch (Exception ex) { cMessage.showError("Process Error", ex.ToString()); } } } |
Vielleicht hat jemand ja einen Tip für mich, Danke!
