2

これはやや不自然な例のように思えるかもしれませんが、頭を悩ませています。

わかりました。WindowsForm をインスタンス化し、フォームで DoSomeWork() というメソッドを呼び出すコンソール アプリがあります。

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

Form1はこんな感じ…

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

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

外側のクラスは、次のようになります...

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

そして最後に InnerClass は次のようになります...

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

(私には) 不明な理由で、InnerClass の BacgroundWorker はProgressChangedイベントを発生させないようです。交換したら

Form1 form = new Form1();

OuterClass outerClass = new OuterClass()

クラス Program では、正常に動作します。では、フォームを介して同じメソッドを呼び出しているときにイベントが発生しないのはなぜですか?

ありがとう!

編集:私は、ProgressChanged イベント ハンドラーを NotImplementedException をスローするままにしておくことで、人々を遠ざけているように見えたので、わかりやすくするために削除しました。

4

2 に答える 2

6

メッセージループを開始するのを忘れたため、Application.Run()を呼び出す必要があります。メッセージループがないと、BackgroundWorkerイベントは機能しません。修正するには:

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

フォームのコンストラクターまたはLoadイベントでDoSomeWork()を呼び出します。

于 2008-10-24T00:16:24.963 に答える
2

あなたは実際throw NotImplementedException();にハンドラーにいましたか?または、これを簡単にモックアップして、削除するのを忘れただけですか?

私の推測では、使用されているさまざまなスレッド アパートメント モデルに関連していると思われます。

私の経験から、シングル スレッド アパートメントの非 UIスレッドがメイン UI スレッドの外部で例外をスローした場合、そのスレッドは警告なしで単純に終了します。

私の記憶が正しければ、Windows フォームにはコンソール アプリケーションとは異なるアパートメント モデルが必要です。それが問題の原因かもしれません。

私は間違っているかもしれませんが、それはいくつかの指針を与えるはずです。

于 2008-10-23T23:08:54.477 に答える