2

これは私のコードです。

BackgroundWorker exportWorker = new BackgroundWorker();

private void btnOK_Click(object sender, RoutedEventArgs e)
{
    exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
    exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);
    exportWorker.RunWorkerAsync();
}


void ExportWorkerDoWork(object sender, DoWorkEventArgs e)
{
    MethodToPerformInThisThread();
    **Dispatcher.Invoke(new Action(() => {MethodofAnotherThreadThatChangesUIStuff();}**
}

void ExportWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
  • 初めてOK ボタン ( btnOK_Click) をクリックすると、先に進み、すべてが正常に実行されます。
  • ここで、コードの実行が終了した後で [OK] ボタンを 2 回クリックすると、太字のコードが 2 回実行されます。つまり、メソッドMethodofAnotherThreadThatChangesUIStuff();が 2 回続けて呼び出されます。
  • 繰り返しますが、OK ボタンを 3 回クリックすると、 MethodofAnotherThreadThatChangesUIStuff();3 回続けて呼び出されます。
  • 等々。

MethodofAnotherThreadThatChangesUIStuff();どのクリックであっても、一度だけ呼び出されるようにします。つまり、一般的にはそのように機能するはずです。

ここで何が欠けていますか?

どんな助けでも本当に感謝します。

4

3 に答える 3

9

ボタンを押すたびに Click ハンドラーの外部で動作するバックグラウンドを宣言しているため、イベントハンドラーを再度追加します。これが、2 回目にメソッドが 2 回呼び出され、3 回目に 3 回呼び出される理由です...

これを解決するには、イベント ハンドラーをクリック メソッドの外側 (コンストラクターなど) に追加し、クリック メソッドに RunAsync() 呼び出しのみを残します。

于 2013-03-27T18:57:24.217 に答える
3

[OK] をクリックするたびに、すべて DoWork メソッドを呼び出す新しいイベント ハンドラーが作成されます。

アプリケーションの初期化に次のコードを配置します。

exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);

btnOK_Clickメソッドには次のもののみを含めます。

exportWorker.RunWorkerAsync();
于 2013-03-27T19:00:11.587 に答える
2

これは、次の行が原因で発生しています。

exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);

btnOK_Clickハンドラ内で実行されています。次のようにハンドラーの外側でイベントをセットアップする場合:

BackgroundWorker exportWorker = new BackgroundWorker();
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);

private void btnOK_Click(object sender, RoutedEventArgs e)
{
exportWorker.RunWorkerAsync();
}

その後、すべてが期待どおりに機能するはずです。

別のオプションは、実際にはハンドラーBackgroundWorker内に新しいを作成することです。btnOK_Click基本的に、クリックごとに新しいワーカーを作成し、ハンドラーで設定してから実行します。その後、それを破棄して、クリックごとに新しいものを作成します。

于 2013-03-27T19:01:41.610 に答える