我有一个使用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函数知道工作人员被取消而不是正常完成。
答案 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
的某些详细信息,可能会提供更多详细信息。