私はDoWorkとRunWorkerCompletedのイベントハンドラにクロージャを使用する単純なBackgroundWorkerを定義しています。これらのハンドラはそれぞれブール値を設定してチェックします。簡略化した形で、コード(.NET 3.5のC#)は次のようになりますクロージャとBackgroundWorkerイベントハンドラ
public void SomeMethod()
{
BackgroundWorker worker = new BackgroundWorker();
bool result = false;
worker.DoWork += new DoWorkEventHandler(
(sender, e) =>
{
result = LengthyOperation();
});
worker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(
(sender, e) =>
{
AppendRunLog("Result: " + (result ? "PASS" : "FAIL"));
});
worker.RunWorkerAsync();
}
のsomeMethodメインUIスレッド上でWPFボタン・ハンドラから呼び出されます。
通常、これはうまくいきますが、(LongyOperation内で生成されたログに基づいて)渡す必要がある操作が失敗したというレポートが頻繁に出ます。つまり、ブール値の結果がCompletedハンドラでfalse DoWorkハンドラで操作がtrueに戻っているはずです。
LengthyOperation内のコードの抜け穴を調べて、私がそこに微妙なバグがないことを確認しました。そして、私はそれがきれいだと確信しています。私は自分の開発環境でそれを再現することができませんでした。
私は結果値をどのように設定して読んでいるかに競合状態がありますか?完了イベントが発生する前に、割り当て操作がDoWorkで完了していることが予想されます。
例を単純化すると、ボタンを無効にする部分が省略され、操作が完了するまで操作を再開できなくなりました。ログはこれに同意します。私はこれを.NET 4に変換するためのサイドプロジェクトを持っており、おそらく学習経験のため以外の理由でBackgroundWorkersをTasksに切り替えるでしょう。サニティチェックに感謝します。 –