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
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.
- 1. BackgroundWorker RunWorkerCompletedEventArgs.Cancelled siempre falsas
- 2. Excepciones no controladas en BackgroundWorker
- 3. manejo de errores con BackgroundWorker
- 4. BackgroundWorker manejo de excepciones
- 5. BackgroundWorker No funciona en VSTO
- 6. Forma correcta de deshacerse de un BackGroundWorker
- 7. C#/VB.Net Tarea vs vs Tema BackgroundWorker
- 8. reutilizar el BackgroundWorker más de una vez
- 9. ¿Cómo esperar a que un BackgroundWorker se cancele?
- 10. Nombrando BackgroundWorker
- 11. Cancelar backgroundworker
- 12. Backgroundworker abortar
- 13. Problema WPF/BackgroundWorker y BitmapSource
- 14. BackgroundWorker y WebBrowser Control
- 15. BackgroundWorker con métodos anónimos?
- 16. Componente BackgroundWorker en servicios
- 17. Cómo detener BackgroundWorker correctamente
- 18. C# Cultura de BackgroundWorker
- 19. ¿Cómo utilizar un BackgroundWorker?
- 20. Actualizar GUI usando BackgroundWorker
- 21. BackgroundWorker and Threads
- 22. C# backgroundWorker informa cadena?
- 23. Cargando imágenes en BackgroundWorker
- 24. Necesita ayuda para detener el subproceso BackgroundWorker
- 25. ¿Es posible matar el hilo de BackgroundWorker?
- 26. Acceso al control de la interfaz de usuario desde BackgroundWorker Thread
- 27. Backgroundworker no informará el progreso
- 28. Diferencia entre BackgroundWorker y Thread?
- 29. Excepciones no controladas en BackgroundWorker
- 30. ¿El BackgroundWorker brinda subprocesos reales?
¿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. –
@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
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. –