2011-06-13 33 views
6

Invocar un subproceso de IU de un subproceso de trabajo se analiza muchas veces y sabemos por qué utilizar BeginInvoke() en lugar de Invoke(). Recientemente publiqué this question y después de hacer algunas investigaciones descubrí que hay al menos tres formas diferentes (internamente podrían ser las mismas) de invocar (asincrónicamente) algo en el hilo de la interfaz de usuario.control.BeginInvoke() Vs Dispatcher Vs SynchronizationContext Vs .. - FIABILIDAD

  1. Control.BeginInvoke()
  2. Usando SynchronizatoinContext Clase
  3. Usando Dispatcher.BeginInvoke(priority..)

Puede alguien decirme que es una forma segura de llamar a un método de forma asíncrona a ser ejecutado el hilo de interfaz de usuario. Cualquier experiencia ? Veo que Dispatcher.BeginInvoke tiene un componente de prioridad, ¿lo hace más confiable?

Contexto:
estamos utilizando someControl.BeginInvoke() pero me di cuenta que a veces (por desgracia sólo en el entorno de producción usuario final) el delegado pasó a BeginInvoke is no ejecutado, que me hace creer que el mensaje posterior que se crea es perderse. Queremos una forma confiable de volver a comunicarse con el hilo de UI. control.Invoke() a veces cuelgan la IU, por lo que tampoco queremos ir allí.

+0

No se debe confundir con WinForms WPF. – SLaks

+0

Tengo un problema similar ... ¿por casualidad logró corregir el problema? –

+0

mismo aquí, ¿alguna actualización? – Pedro77

Respuesta

0

Todos funcionan como deberían, si llama al BeginInvoke y a veces no pasa nada, hay algún problema en el entorno o en el código de llamada, probablemente - no es que BeginInvoke no sea confiable. Bueno, podría haber un error, pero es mucho menos probable.

Quizás podría dar más contexto y podemos ayudar a diagnosticar.

+0

Gracias por la respuesta. Tengo un escenario similar en nuestro código. http://stackoverflow.com/questions/6270514/control-begininvoke-fails-to-call-the-delegate – karephul

+0

Hola karephul, eso es interesante pero no ayuda mucho en este caso ya que tampoco encontraron una respuesta . ¿Cuál es su configuración básica en términos de hilos, procesos, bloqueos, etc.? –

+0

Oh ... ¿es ese el mismo problema? ¿Recién publicado aquí? –

0

SynchronizationContext es más abstracto y adaptable en más casos. Es un envoltorio de implementación específica. MSDN dice "Los proveedores de modelos de sincronización pueden extender esta clase y proporcionar sus propias implementaciones para estos métodos".

+0

SynchronizationContext se proporciona aquí: http://social.msdn.microsoft.com/Forums/en-US/async/thread/1218c86e-fa9b-45a6-93b0-5e27616a6c21 – Steel

0

Debe tener cuidado con las funciones lambda y BeginInvoke. Tenía un código como este que dio lugar a todo tipo de comportamiento extraño.

MyThing thing; 
while(GetThing(ref thing)) { 
    control.BeginInvoke((Action)(() => control.Text = thing.ToString())); 
} 

El problema es que thing no se evalúa cuando se crea la función lambda. Se evalúa cuando se ejecuta la función lamdba. Pero está ligado a una variable que está cambiando al mismo tiempo en el hilo del productor.

puede solucionar este problema declarando una copia de la variable local thing

MyThing thing; 
while(GetThing(ref thing)) { 
    MyThing thing_x = thing; 
    control.BeginInvoke((Action)(() => control.Text = thing_x.ToString())); 
} 

o puede poner la fealdad BeginInvoke en una envoltura

MyThing thing; 
while(GetThing(ref thing)) { 
    SetText(thing); 
} 

void SetText(MyThing thing) 
    control.BeginInvoke((Action)(() => control.Text = thing.ToString())); 
} 
Cuestiones relacionadas