2011-06-24 18 views
9

Si invoco un método en el subproceso de interfaz de usuario, ¿está encriptado por la cola de mensajes de Windows y, por lo tanto, no necesita volver a entrar?¿Es necesario que un método organizado en el subproceso de UI sea seguro para subprocesos?

private void CalledFromWorkerThread() 
    { 
     //changed from 'InvokeRequired' Anti-Pattern 
     this.Invoke((Action) (() => _counter++; /* Is this ok? */)); 
    } 

Aclaración: Es sólo el hilo de interfaz de usuario que vaya a acceder _counter.

+0

También debe utilizar un candado en el mostrador si no lo está haciendo. –

+1

vea también aquí: http://www.yoda.arachsys.com/csharp/threads/winforms.shtml –

+3

La prueba 'InvokeRequired' es un anti-patrón. 'Control.Invoke' ya contiene dicho control. –

Respuesta

9

Lo que tiene está bien, suponiendo que _counter solo se puede acceder mediante el hilo de la interfaz de usuario.

Si dos hilos llaman a su CalledFromWorkerThread, entonces _counter se incrementará correctamente y se mantendrá seguro para los subprocesos con lo que tenga.

2

Delegará la llamada desde el mismo hilo, no necesariamente significa que todo lo que haga en esa función será seguro para subprocesos.

+0

¡Asuma que este es el único código que cambia ese campo! ¿Es seguro para subprocesos? –

+0

Entonces es el único subproceso que accede a él (por lo que no necesita ser seguro para la rosca). Entonces, sí, es seguro. – ghimireniraj

4

Según la aclaración de que solo el hilo de la interfaz de usuario está accediendo a _counter, no necesita un bloqueo. He actualizado mi ejemplo. Prefiero codificarlo de esta manera para evitar el cheque adicional si se requiere invocar.

private void CalledFromWorkerThred() 
{ 
    this.Invoke((Action) (() => _counter++;)); 
} 
+0

+1 He actualizado la pregunta. Saludos, oídos. –

Cuestiones relacionadas