2012-03-26 11 views
0

Ok, es gibt viele Fragen zu diesem Fehler, aber ich kann keine Lösung für mein Problem finden. Ich habe einen Thread, der ein Steuerelement aus der Datenbank während einer langen laufenden Operation lädt. Wenn ich mein Fenster vor diesem Thread endet schließen, wirft es ein Invoke or BeginInvoke cannot be called on a control until the window handle has been created., wenn die Invoke"Invoke oder BeginInvoke kann nicht aufgerufen werden ..." beim Schließen eines Fensters

tun ich den Code geändert haben, um wie folgt aussehen:

If Not Me.IsDisposed And Me.Created And Me.IsHandleCreated Then ' 
     Me.Invoke(New AddImageDelegate(AddressOf AddImage), item.PartNo, New Bitmap(item.ImagePath)) 
     Me.Invoke(New SetImageDelegate(AddressOf SetImage), I, item.PartNo) 
End If 

jedoch noch trifft die Invoke Linie und wirft den Fehler auf. Wenn das Debuggen bei der Ausnahme stoppt, ist IsDisposed wahr, .Created ist falsch und .IsHandleCreated ist falsch. Das Überprüfen dieser Eigenschaften hilft also nicht.

Also ... wie verhindere ich, dass in dieser Situation die Aufrufzeile ausgeführt wird?

+0

mögliche Duplikate von [C# Winforms Threading: Geschlossen Formular wird aufgerufen] (http://stackoverflow.com/questions/3565551/c-sharp-winforms-threading-closed-form-gets-invoiced) –

+0

@HansPassant, ja das scheint der Fall zu sein. Immer schwer zu finden, wenn es so viele ähnliche Probleme gibt, die nicht gleich sind. – Kratz

Antwort

1

Es könnte sein, dass Invoke aufgerufen wurde, bevor Ihr Formular geschlossen wurde?

Anstatt das zu tun Wenn ich empfehlen würde, Ihr Formular nicht zu schließen, bis Sie es geschafft haben, den zweiten Thread zu stoppen, ist es weitaus sicherer.

+0

Das Formular wird geschlossen, wenn der Benutzer das übergeordnete Fenster schließt, der Thread gehört zu einem Steuerelement, das irgendwo im Formular verschachtelt ist. Gibt es eine einfache Möglichkeit für die Steuerung, das Schließen des Formulars zu verhindern? – Kratz

+0

Ohne es zu testen, bin ich sicher, dass Sie das onformclosing-Ereignis (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onformclosing.aspx) erfassen und "e.Cancel = wahr". Dies sollte das Schließen aufheben. Oder Sie könnten eine Eigenschaft auf dem untergeordneten Formular "IsClosable" erstellen und warten, bis Ihr zweiter Thread es auf "wahr" setzt. Sie können sogar den übergeordneten Thread im Closing-Ereignis blockieren, bis der zweite Thread abgeschlossen ist. – pingoo