Domanda

Questo può sembrare un esempio un po 'inventato, ma sono rimasto a grattarmi la testa.

Ok, ho un'app console che crea un'istanza di WindowsForm e chiama un metodo chiamato DoSomeWork () nel modulo.

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

Form1 si presenta così ...

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

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

La classe esterna, a sua volta, assomiglia a questa ...

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

E infine InnerClass assomiglia a questo ...

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();
    }
  }

Per un motivo sconosciuto (per me), BacgroundWorker in InnerClass non sembra mai lanciare l'evento ProgressChanged . Se sostituisco

Form1 form = new Form1();

con

OuterClass outerClass = new OuterClass()

nel programma di classe, funziona benissimo. Quindi perché i miei eventi non si attivano quando chiamo gli stessi metodi tramite un modulo?

Grazie!

EDIT: mi è sembrato di buttare via le persone lasciando il gestore di eventi ProgressChanged come un NotImplementedException, quindi l'ho rimosso per chiarezza.

È stato utile?

Soluzione

Hai dimenticato di avviare un ciclo di messaggi, è necessario chiamare Application.Run (). Senza un ciclo di messaggi, gli eventi BackgroundWorker non possono funzionare. Per risolvere:

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

Chiama DoSomeWork () nel costruttore del modulo o è l'evento Load.

Altri suggerimenti

Hai effettivamente gettato NotImplementedException (); nel gestore? o lo stai semplicemente prendendo in giro velocemente e hai dimenticato di rimuoverlo?

La mia ipotesi sarebbe che sia correlato ai diversi modelli di appartamento thread utilizzati.

Dalla mia esperienza se un thread non-UI a thread singolo genera un'eccezione al di fuori del thread dell'interfaccia utente principale, quel thread morirà semplicemente senza alcun preavviso.

Se ricordo correttamente, Windows Form richiede un modello di appartamento diverso rispetto alle applicazioni console. Questa potrebbe essere la fonte del problema.

Potrei sbagliarmi, ma ciò dovrebbe dare alcuni suggerimenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top