取消使用lambda设置的Backgroundworker

时间:2013-03-24 00:52:50

标签: c# lambda backgroundworker

我有一个使用lambda创建的backgroundworker,如下所示:

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

我希望能够取消后台工作程序,然后使用RunWorkerCompletedEventArgs e.Canceled属性知道它已在RunWorkerCompleted函数中被取消。

到目前为止,我一直无法找到将参数传递给RunWorkerCompleted函数的方法,并且仍然能够访问RunWorkerCompletedEventArgs。

我尝试将RunWorkerCompletedEventArgs参数添加到RunWorkerCompleted调用的函数中,然后像这样传递RunWorkerCompletedEventArgs:

fileCountWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, e) => UpdateCountInFolderListViewForItem(index, e));

但这似乎不起作用。

有办法做到这一点吗?

修改

根据以下评论,我做了以下更改:

我按如下方式更改了DoWork事件(将obj和e添加为worker函数中的参数):

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 bwAsync = sender as BackgroundWorker;
if (bwAsync.CancellationPending)
   {
      e.Cancel = true;
      return;
   }

结果是当我取消后台工作时,它确实停止了worker函数,但RunWorkerCompleted函数(UpdateCountInFolderListViewForItem)中的RunWorkerCompletedEventArgs仍然将Canceled属性设置为False,因此该函数无法判断该worker已被取消

所以我仍然坚持让RunWorkerCompleted函数知道工作人员被取消而不是正常完成。

1 个答案:

答案 0 :(得分:0)

您只需致电BackgroundWorker.CancelAsync()

您的工作人员代码需要检查BackgroundWorker.CancellationPending并停止正在执行的操作以“取消”...但是,您的lambda没有做任何您可以取消的操作。

通常你会做的是这样的事情:

//...
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的某些详细信息,可能会提供更多详细信息。