2010-12-16 26 views
13

En mi aplicación tengo un control de usuario que realiza operaciones asincrónicas usando el grupo de subprocesos. El método de agrupación de hebras se parece a:Detectar si se eliminó el control

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

Mi problema es que si el usuario cierra el diálogo ... el control de usuario se dispone y consigo la excepción:

invocar o BeginInvoke no puede ser llamado en un control hasta que se haya creado el identificador de ventana.

¿Conoces alguna forma de detectar si el cuadro de diálogo fue eliminado? No quiero tener una propiedad en control que el diálogo establezca cuando se cierre. ¿Hay alguna otra manera de resolver esto?

Gracias,

Radu

+0

+1. Pregunta muy útil. – Nick

Respuesta

17
+0

+1: todo está dicho :) – LaGrandMere

+0

Marque esta o cualquier otra respuesta como la respuesta correcta si resuelve su problema. :) –

+1

En realidad, no resuelve el 100% de los casos. Ver http://stackoverflow.com/questions/4460709/detect-if-control-was-disposed/4460737#4460737 debajo de – Nick

6

Puede utilizar Control.IsDisposed propiedad.

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

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

No sé cómo podría extrañar eso. Lo busqué explícitamente :) –

+0

Debe verificar 'IsDisposed' antes de llamar a' BeginInvoke', ya que falla si se elimina el control. – max

+0

ok ... Me olvidé de eso ... Edité la respuesta ... gracias –

0

Usted puede intentar usar un objeto de sincronización como EventWaitHandle a señalar el subproceso de trabajo que el hilo principal está a punto de terminar. Entonces el hilo de trabajo puede finalizar su ejecución.

Cuestiones relacionadas