Pregunta

Esto puede parecer un ejemplo un tanto artificial, pero me quedo rascándome la cabeza.

Bien, tengo una aplicación de consola que crea una instancia de WindowsForm y llama a un método llamado DoSomeWork () en el formulario.

class Program
  { 
    static void Main(string[] args)
    {
      Form1 form = new Form1();         
      form.DoSomeWork();   
    }
  }

Form1 tiene este aspecto ...

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    public void DoSomeWork()
    {
      OuterClass outerClass = new OuterClass();
      outerClass.DoSomeWork();
    }    
  }

La clase externa, a su vez, se ve así ...

public class OuterClass
  {
    public void DoSomeWork()
    {
      InnerClass innerClass = new InnerClass();
      innerClass.DoSomeWork();
    }
  }

Y finalmente InnerClass se parece a esto ...

public class InnerClass
  {
    private BackgroundWorker _backgroundWorker = new BackgroundWorker();

    public InnerClass()
    {
      _backgroundWorker.WorkerReportsProgress = true;
      _backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
      _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
    }

    void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      int i = 0; //I've placed a break point here. But it's never hit
    }

    void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      BackgroundWorker worker = sender as BackgroundWorker;

      worker.ReportProgress(42);
    }

    public void DoSomeWork()
    {
      _backgroundWorker.RunWorkerAsync();
    }
  }

Por una razón desconocida (para mí), el BacgroundWorker en InnerClass nunca parece activar el evento ProgressChanged . Si sustituyo

Form1 form = new Form1();

con

OuterClass outerClass = new OuterClass()

en el programa de clase, funciona bien. Entonces, ¿por qué mis eventos no se activan cuando llamo a los mismos métodos a través de un Formulario?

¡Gracias!

EDITAR: parecía que estaba rechazando a las personas dejando el controlador de eventos ProgressChanged como lanzando una NotImplementedException, así que lo he eliminado para mayor claridad.

¿Fue útil?

Solución

Olvidó iniciar un bucle de mensajes, se requiere llamar a Application.Run (). Sin un bucle de mensajes, los eventos BackgroundWorker no pueden funcionar. Para corregir:

static void Main(string[] args)
{
  Application.Run(new Form1());   
}

Llame a DoSomeWork () en el constructor del formulario o en el evento Load.

Otros consejos

¿Realmente lanzó NotImplementedException (); en el controlador? ¿O simplemente te burlas de esto rápido y te olvidaste de eliminarlo?

Mi conjetura sería que está relacionado con diferentes modelos de apartamentos de subprocesos que se están utilizando.

Según mi experiencia, si un subproceso sin IU de un solo subproceso genera una excepción fuera del subproceso de la interfaz de usuario principal, ese subproceso simplemente morirá sin ninguna advertencia.

Los Formularios de Windows requieren un modelo de apartamento diferente al de las aplicaciones de la Consola si recuerdo correctamente. Esa podría ser la fuente del problema.

Podría estar equivocado, pero eso debería dar algunos consejos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top