2010-12-16 8 views
13

In meiner Anwendung habe ich ein Benutzersteuerelement, das Async-Operationen mit Thread-Pool ausführt. Die Thread-Pool-Methode wie folgt aussieht:Erkennen, ob die Kontrolle entsorgt wurde

private void AsyncFunction(object state) 
    { 
     ... do the calculation 
     //refresh the grid data on the UI thread 
     this.BeginInvoke(new MethodInvoker(() => 
               { 
          ... update the ui 
               })); 
    } 

Mein Problem ist, dass, wenn der Benutzer den Dialog schließt ... die Benutzersteuerung angeordnet wird und ich bekomme die Ausnahme:

Invoke oder BeginInvoke kann nicht aufgerufen werden auf einem Steuerelement, bis das Fensterhandle erstellt wurde.

Kennen Sie einen Weg zu erkennen, ob der Dialog entsorgt wurde? Ich möchte nicht eine Eigenschaft auf Kontrolle, die der Dialog beim Schließen festgelegt. Gibt es eine andere Möglichkeit, dies zu lösen?

Danke,

Radu

+0

+1. Sehr nützliche Frage. – Nick

Antwort

17
+0

+1: alles ist gesagt :) – LaGrandMere

+0

Bitte markieren Sie diese oder eine andere Antwort als die richtige Antwort, wenn es Ihr Problem löst. :) –

+1

Tatsächlich löst es nicht 100% der Fälle. Siehe http://stackoverflow.com/questions/4460709/detect-if-control-was-disposed/4460737#4460737 unter – Nick

6

können Sie Control.IsDisposed Eigenschaft verwenden.

try 
{ 
    if(!this.IsDisposed) 
    { 
     this.BeginInvoke(new MethodInvoker(() => 

         { 
           // update my control 
         } 
     )); 
    } 
} 
catch (InvalidOperationException) 
{ 
    // Do something meaningful if you need to. 
} 
+0

Ich weiß nicht, wie ich das vermissen könnte. Ich habe explizit danach gesucht :) –

+0

Sie müssen nach 'IsDisposed' suchen, bevor Sie' BeginInvoke' aufrufen, weil es fehlschlägt, wenn die Kontrolle entsorgt wird. – max

+0

ok .. ich verpasste das .. ich habe die antwort bearbeitet .. danke –

0

können Sie versuchen, ein Synchronisationsobjekt wie EventWaitHandle mit dem Arbeits Thread zu signalisieren, dass der Haupt-Thread zu beenden, ist ungefähr. Dann kann der Worker-Thread seine Ausführung beenden.

Verwandte Themen