Question

Cela peut sembler être un exemple quelque peu artificiel, mais il me reste à me gratter la tête.

Ok, j'ai une application console qui instancie un WindowsForm et appelle une méthode appelée DoSomeWork () sur le formulaire.

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

Form1 ressemble à ceci ...

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

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

La classe externe, à son tour, ressemble à ceci ...

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

Et enfin, InnerClass ressemble à ceci ...

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

Pour une raison inconnue (pour moi), BacgroundWorker dans InnerClass ne semble jamais déclencher l'événement ProgressChanged . Si je remplace

Form1 form = new Form1();

avec

OuterClass outerClass = new OuterClass()

en classe programme, cela fonctionne bien. Alors, pourquoi mes événements ne se déclenchent-ils pas lorsque j'appelle les mêmes méthodes via un formulaire?

Merci!

EDIT: Il me semblait que je laissais les gens de côté en laissant le gestionnaire d’événements ProgressChanged en lançant une exception NotImplementedException. Je l’ai donc supprimée pour plus de clarté.

Était-ce utile?

La solution

Vous avez oublié de démarrer une boucle de message, appeler Application.Run () est requis. Sans boucle de message, les événements BackgroundWorker ne peuvent pas fonctionner. Pour réparer:

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

Appelez DoSomeWork () dans le constructeur du formulaire ou son événement Load.

Autres conseils

Avez-vous réellement jeté NotImplementedException (); dans le gestionnaire? ou vous vous moquez de ça rapidement et avez oublié de l'enlever?

Je suppose que cela est lié aux différents modèles d'appartements à thread utilisés.

D'après mon expérience, si un thread non-UI à un seul thread lève une exception en dehors du fil principal de l'interface utilisateur, ce thread va simplement mourir sans aucun avertissement.

Windows Forms nécessite un modèle d'appartement différent de celui des applications console, si mes souvenirs sont exacts. Cela pourrait être la source du problème.

Je peux me tromper, mais cela devrait donner des indications.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top