Ich muss ein Formular aus einem Thread schließen und ich verwende die Methode Invoke des Formulars zum Aufrufen der Close() -Methode.Schließen Sie ein Formular aus einem externen Thread mithilfe der Invoke-Methode
Das Problem ist, dass beim Schließen das Formular entsorgt wird und ich eine InvalidOperationException mit der Nachricht "Invoke oder BeginInvoke kann auf einem Steuerelement nicht aufgerufen werden, bis das Fensterhandle erstellt wurde.".
Ich habe diese Ausnahme nur beim Debuggen mit einem "Step Into" in der Close-Methode, aber ich möchte nicht mit einem möglichen Fehler beim normalen Ausführen riskieren.
Dies ist ein Beispiel-Code, es zu reproduzieren:
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(CloseForm);
thread.Start();
}
private void CloseForm()
{
this.Invoke(new EventHandler(
delegate
{
Close(); // Entering with a "Step Into" here it crashes.
}
));
}
Das Formular wird in dem automatischen erzeugte Code für das Formular angeordnet sind (die ich nicht ändern möchte):
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
I Ich würde es begrüßen, wenn jemand mir eine Lösung für diese oder eine andere Möglichkeit geben könnte, ein Formular von einem anderen Thread zu schließen.
Kein Repro Mit dem geposteten Code habe ich keinen erwartet. Der generelle Grund für diese Ausnahme besteht darin, dass Ihr Thread weiterhin Begin/Invoke * aufruft, nachdem * das Formular bereits geschlossen wurde. http: // Stapelüberlauf.com/questions/1731384/how-to-stop-backgroundwork-on-forms-closing-event/1732361 # 1732361 –
Kann nicht reproduzieren Ausnahme mit Code, den Sie zur Verfügung gestellt –
Es ist sehr einfach zu reproduzieren, nur mit dem "Step Into" Option und stellen Sie sicher, dass es in die Dispose-Methode eintritt (möglicherweise kann ein Breakpoint helfen), bevor Sie die Invoke-Methode verlassen. – Alfort