Principales respuestas
Como abrir un formulario desde backgroundworker

Pregunta
-
Hola. Necesito ayuda para crear un formulario desde backgroundworker.dowork
El backgroundworker.dowork contiene un for que se recorre muchas veces (por eso decidi hacerlo asincronicamente).
Cuando se cumple cierta condicion, se debe abrir un formulario (cada vez que se cumple esta condicion, se abre nuevamente el mismo formulario). Segun lei no se puede abrir un formulario desde el backgroundworker, pero no se me ocurre como hacerlo
Private Sub BackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)_ Handles BackgroundWorker.DoWork
For i As Integer = 0 To 99
.
.
.
if condicion =1 then
mensaje = New msgboxcustom
mensaje.Show()
end if
next
end sub
Como ven, se recorre el for 100 veces, y se abren el formulario mensaje cada vez que se cumple la condicion
Saludos y espero que puedan orientarme
Respuestas
-
Cambia el diseño, no tiene mucho sentido. Como poder, podrías abrir el formulario mediante un Control.Invoke, pero el backgroundworker no está pensado para eso. La idea del backgroundworker es lanzar un nuevo hilo de ejecución que realice un cálculo relativamente largo mientras la interfaz de usuario sigue respondiendo (se bloquearía durante la realización del cálculo si lo hicieras en el hilo principal). Como la interfaz de usuario es monohilo, no se puede pintar nada en ella desde ese hilo secundario. El backgroundworker debe ubicar en una variable los resultados de ese cálculo, y cuando ya haya terminado, esa variable se devuelve al hilo principal (que es el único que puede manipular la pantalla) y este hilo presenta los resultados, una vez que el backgroundworker ya ha terminado. El backgroundworker no debe interactuar con la pantalla durante la realización del cálculo (aparte de dar una indicación de progreso, que puede hacerse con su evento ReportProgress, que internamente traslada la ejecución al hilo principal para poder mostrar el progreso). Si te encuentras con que tienes que presentar un formulario durante la ejecución del backgroundworker, significa que tienes hecho un mal diseño; la operación que muestra ese formulario no debería ejecutarse en un backgroundworker.
- Marcado como respuesta Martin_lp lunes, 3 de noviembre de 2014 22:32
Todas las respuestas
-
Cambia el diseño, no tiene mucho sentido. Como poder, podrías abrir el formulario mediante un Control.Invoke, pero el backgroundworker no está pensado para eso. La idea del backgroundworker es lanzar un nuevo hilo de ejecución que realice un cálculo relativamente largo mientras la interfaz de usuario sigue respondiendo (se bloquearía durante la realización del cálculo si lo hicieras en el hilo principal). Como la interfaz de usuario es monohilo, no se puede pintar nada en ella desde ese hilo secundario. El backgroundworker debe ubicar en una variable los resultados de ese cálculo, y cuando ya haya terminado, esa variable se devuelve al hilo principal (que es el único que puede manipular la pantalla) y este hilo presenta los resultados, una vez que el backgroundworker ya ha terminado. El backgroundworker no debe interactuar con la pantalla durante la realización del cálculo (aparte de dar una indicación de progreso, que puede hacerse con su evento ReportProgress, que internamente traslada la ejecución al hilo principal para poder mostrar el progreso). Si te encuentras con que tienes que presentar un formulario durante la ejecución del backgroundworker, significa que tienes hecho un mal diseño; la operación que muestra ese formulario no debería ejecutarse en un backgroundworker.
- Marcado como respuesta Martin_lp lunes, 3 de noviembre de 2014 22:32
-