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. Backgroundworker abortar
- 11. Cancelar backgroundworker
- 12. Nombrando BackgroundWorker
- 13. Problema WPF/BackgroundWorker y BitmapSource
- 14. C# Cultura de BackgroundWorker
- 15. BackgroundWorker y WebBrowser Control
- 16. BackgroundWorker con métodos anónimos?
- 17. BackgroundWorker and Threads
- 18. Actualizar GUI usando BackgroundWorker
- 19. ¿Cómo utilizar un BackgroundWorker?
- 20. C# backgroundWorker informa cadena?
- 21. Cómo detener BackgroundWorker correctamente
- 22. Componente BackgroundWorker en servicios
- 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. Diferencia entre BackgroundWorker y Thread?
- 28. ¿El BackgroundWorker brinda subprocesos reales?
- 29. BackgroundWorker acceso multiproceso al formulario
- 30. C# Winform ProgressBar y BackgroundWorker
¿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. –