none
Como abrir un formulario desde backgroundworker RRS feed

  • 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

    sábado, 1 de noviembre de 2014 0:35

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
    sábado, 1 de noviembre de 2014 6:53

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
    sábado, 1 de noviembre de 2014 6:53
  • no estoy seguro de que el programa se pueda hacer de otra forma, pero lo intentaré. Gracias
    lunes, 3 de noviembre de 2014 22:32