2010-05-10 41 views
25

Mi aplicación C# tiene varios trabajadores de fondo. A veces, un trabajador de fondo despedirá a otro. Cuando se completa el primer trabajador en segundo plano y se desencadena el evento RunWorkerCompleted, ¿en qué hilo se desencadenará ese evento, la interfaz de usuario o el primer trabajador de fondo del que se llamó RunWorkerAsync? Estoy usando Microsoft Visual C# 2008 Express Edition. Cualquier pensamiento o sugerencia que pueda tener será apreciado. Gracias.BackgroundWorker RunWorkerCompleted Evento

Respuesta

57

Si el BackgroundWorker fue creado desde el subproceso de interfaz de usuario, entonces el evento RunWorkerCompleted también se planteará en el subproceso de interfaz de usuario.

Si se creó a partir de un hilo de fondo, el evento se generará en un hilo de fondo indefinido (no necesariamente el mismo hilo, a menos que esté usando un SynchronizationContext personalizado).

Curiosamente, esto no parece estar bien documentado en MSDN. La mejor referencia pude encontrar fue here:

La mejor forma de poner en práctica múltiples hilos en su aplicación es utilizar el componente BackgroundWorker. El componente BackgroundWorker usa un modelo basado en eventos para multihilo. El hilo de fondo ejecuta su controlador de eventos DoWork, y el hilo que crea los controles ejecuta los controladores de eventos ProgressChanged y RunWorkerCompleted. Puede llamar a sus controles desde sus controladores de eventos ProgressChanged y RunWorkerCompleted.

+0

¿Sería este el lugar donde se creó la instancia del control? Todos mis trabajadores en segundo plano son instanciados (presumiblemente) desde el hilo de UI en la función 'InitializeComponent()' predeterminada. –

+0

@Jim: Sí, una redacción ligeramente pobre en la toma original; en realidad es el hilo que creó el 'BackgroundWorker' que recibirá los eventos, y debes llamar' RunWorkerAsync' del mismo hilo. Para propósitos de cordura, ese debería ser generalmente el hilo de UI. – Aaronaught

+8

Esto no es correcto. Solo se generará en el subproceso de interfaz de usuario si el subproceso de interfaz de usuario creó la instancia de BGW. Si un subproceso creó el BGW, se generará en una cadena de subprocesos arbitraria. –