2008-08-05 19 views

Respuesta

3

Si la modificación de datos no consume demasiado tiempo (es decir, si el propósito principal del hilo de fondo no es la modificación real de datos), intente mover la sección que modifica los datos a un delegado e invocar a ese delegado.

Si el trabajo pesado real es en los datos, probablemente tendrá que crear una copia profunda de estos datos para pasar al hilo de fondo, que enviará los datos procesados ​​de nuevo a la secuencia de UI mediante Invoke nuevamente.

Sólo tendrá que mover el código que cambia los datos en la función de delegado (porque el cambio de datos es lo que desencadena la actualización de control). Aparte de eso, no deberías tener que escribir nada extra.

3

Usted debe ser capaz de hacer algo como:

if (control.InvokeRequired) 
{ 
    control.Invoke(delegateWithMyCode); 
} 
else 
{ 
    delegateWithMyCode(); 
} 

InvokeRequired es una propiedad sobre los controles para ver si está en el hilo correcto, entonces invocación se invoque el delegado en la secuencia correcta.

ACTUALIZACIÓN: En realidad, en mi último trabajo que hicimos algo como esto:

private void SomeEventHandler(Object someParam) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam); 
    } 

    // Regular handling code 
} 

que elimina la necesidad de que el bloque más y tipo de tensa el código.

1

Como no tengo un caso de prueba desde el que puedo garantizar esta solución, me parece que un escenario similar al utilizado para actualizar las barras de progreso en diferentes hilos (usar un delegado) sería ser adecuado aquí.

public delegate void DataBindDelegate(); 
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind); 

public void DoDataBind() 
{ 
    DataBind(); 
} 

Si las necesidades de enlace de datos a ser realizadas por un hilo en particular, y luego dejar que el hilo de hacer el trabajo!

0

Si la llamada de subprocesos es "ilegal" (es decir, la llamada de DataBind afecta controles que no se crearon en el subproceso desde el que se llama), debe crear un delegado para que incluso la decisión/preparación del DataBind no se hace en el hilo de creación de control, cualquier modificación resultante de ellos (es decir, DataBind()) será.

Se podría llamar a mi código desde el subproceso de trabajo, así:

this.BindData.Invoke(); 

Esto entonces hacer que el hilo original para hacer la unión, que (suponiendo que es el hilo que creó los controles) debería funcionar.

0

En WPF y Silverlight la infraestructura de unión se ocupa de la conmutación a la rosca de interfaz de usuario.

Cuestiones relacionadas