Frage

Dies mag wie ein etwas konstruiertes Beispiel scheinen, aber ich habe meinen Kopf kratzen.

Ok, ich habe eine Konsolenanwendung, die eine Windows instanziiert und ruft eine Methode DoSomeWork () auf dem Formular aufgerufen.

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

Form1 sieht wie folgt aus ...

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

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

Äußere Klasse, die wiederum sieht wie folgt aus ...

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

Und schließlich Innerclass sieht wie folgt aus ...

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

Aus einem Grund nicht bekannt (für mich), scheint die BacgroundWorker in Innerclass nie die Feuer Progress Veranstaltung. Wenn ich ersetzen

Form1 form = new Form1();

mit

OuterClass outerClass = new OuterClass()

in der Klasse Programm, es funktioniert gut. Warum also ist, dass meine Ereignisse nicht ausgelöst, wenn ich die gleichen Methoden durch ein Formular bin Aufruf?

Danke!

EDIT:. Ich schien Menschen durch das Verlassen des Progress Event-Handler werden Abwerfen eine NotImplementedException werfen, also habe ich es aus Gründen der Klarheit entfernt

War es hilfreich?

Lösung

Sie haben vergessen, eine Nachrichtenschleife zu starten, ruft Application.Run () erforderlich ist. Ohne eine Nachrichtenschleife, kann nicht funktionieren, die Background Ereignisse. Um dies zu beheben:

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

Rufen DoSomeWork () im Konstruktor des Formulars oder es ist Load-Ereignis.

Andere Tipps

Haben Sie tatsächlich in dem Handler throw NotImplementedException();? oder Sie gerade diese auf schnelle und vergessen haben, spöttisch, es zu entfernen?

Meine Vermutung wäre, dass es zu unterschiedlichen Gewinde Wohnung Modelle werden genutzt verwandt ist.

Aus meiner Erfahrung, wenn eine Single-Thread-Wohnung nicht-UI Thread eine Ausnahme außerhalb des Haupt-UI-Thread führt, wird dieser Thread stirbt einfach ohne Vorwarnung.

Windows Forms benötigen eine andere Wohnung Modell als Konsolenanwendungen, wenn ich mich richtig erinnere. Das könnte die Ursache des Problems sein.

Ich könnte falsch sein, aber das sollte einige Hinweise geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top