1

ここに示すように、ラムダを使用して作成されたバックグラウンドワーカーがいます。

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関数に、ワーカーが正常に完了するのではなくキャンセルされたことを認識させることに固執しています。

4

1 に答える 1

0

を呼び出す必要がありますBackgroundWorker.CancelAsync()

ワーカーコードはBackgroundWorker.CancellationPending、「キャンセル」するために実行していることを確認して停止する必要があります...しかし、ラムダは実際にキャンセルできることを何も実行していません。

通常、あなたがすることは次のようなものです:

//...
fileCountWorker.DoWork += (obj, e) =>
{
    for (int i = 0; i < 1000 && fileCountWorker.CancellationPending; ++i)
    {
        Thread.Sleep(500);/* really do other work here */
    }
    e.Cancel = fileCountWorker.CancellationPending;
};

fileCountWorker.RunWorkerAsync(); 

//...

fileCountWorker.CancelAsync();

の詳細を提供する場合はGetFileInfo、さらに詳細を提供できる可能性があります。

于 2013-03-24T01:09:58.670 に答える