ここに示すように、ラムダを使用して作成されたバックグラウンドワーカーがいます。
BackgroundWorker fileCountWorker= new BackgroundWorker();
fileCountWorker.WorkerSupportsCancellation = true;
fileCountWorker.DoWork += new DoWorkEventHandler((obj, e) => GetFileInfo(folder, subs));
fileCountWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, e) => UpdateCountInFolderListViewForItem(index));
fileCountWorker.RunWorkerAsync();
backgroundworkerをキャンセルできるようにしたいのですが、RunWorkerCompletedEventArgse.Canceledプロパティを使用してRunWorkerCompleted関数でキャンセルされたことを知りたいです。
これまでのところ、RunWorkerCompleted関数にパラメーターを渡し、RunWorkerCompletedEventArgsにアクセスする機能を維持する方法を見つけることができませんでした。
RunWorkerCompletedによって呼び出される関数にRunWorkerCompletedEventArgsパラメーターを追加してから、次のようにRunWorkerCompletedEventArgsを渡してみました。
fileCountWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, e) => UpdateCountInFolderListViewForItem(index, e));
しかし、それはうまくいかなかったようです。
これを行う方法はありますか?
編集:
以下のコメントに続いて、私は次の変更を行いました。
DoWorkイベントを次のように変更しました(ワーカー関数のパラメーターとしてobjとeを追加します)。
fileCountWorker.DoWork += new DoWorkEventHandler((obj, e) => GetFileInfo(folder, subs,obj,e));
次に、RunWorkerCompleted関数を次のように変更しました(RunWorkerCompleted関数のパラメーターとしてobjとeを追加します)。
fileCountWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, e) => UpdateCountInFolderListViewForItem(index, obj, e));
UIスレッドからCancelAsyncを呼び出します。
if (bgw.WorkerSupportsCancellation)
{
bgw.CancelAsync();
}
次に、backgroundworker内から、次のようにキャンセル保留を確認します。
BackgroundWorker bwAsync = sender as BackgroundWorker;
if (bwAsync.CancellationPending)
{
e.Cancel = true;
return;
}
その結果、backgroundworkerをキャンセルすると、worker関数は停止しますが、RunWorkerCompleted関数(UpdateCountInFolderListViewForItem)のRunWorkerCompletedEventArgsのCanceledプロパティがFalseに設定されているため、関数はワーカーがキャンセルされたことを認識できません。
そのため、RunWorkerCompleted関数に、ワーカーが正常に完了するのではなくキャンセルされたことを認識させることに固執しています。