This is how I set up my Background Worker
问题是:我如何在中途终止这个过程?我必须创建一个取消按钮,停止当前处理。
我想过使用下面的一行......
if ((worker.CancellationPending == true))
{
e.Cancel = true;
}
...并将AllocateTrades2方法封装在里面,但这意味着我必须从其他地方调用Cancel Flag,并且只有在方法完成处理后才会检查它。
而且我不能只是“假装”它没有做任何事情,因为如果用户再次点击相同的操作,将抛出工作人员正在使用的异常。
我想做的一个例子:
public void bw_DoWork(object sender, DoWorkEventArgs e)
{
AllocateTrades2();
}
public void AllocateTrades()
{
Method1();
CheckTerminate();
Method2();
CheckTerminate();
//Click the cancel button in the UI during method 3 processing
Method3();
CheckTerminate();
}
CheckTerminate()会停止所有处理,并使其可用于将来的调用。我正在尝试做什么?
答案 0 :(得分:3)
你必须做点像......
public void AllocateTrades()
{
if (!worker.CancellationPending)
{
Method1();
}
if (!worker.CancellationPending)
{
Method2();
}
if (!worker.CancellationPending)
{
Method3();
}
}
.Net无法为您决定什么是与您的后台工作有关的“原子”操作,因此您必须决定检查待处理取消的频率和位置。
答案 1 :(得分:0)
答案是是。
无论您检查'取消发送',您都可以停止工作。
在您的示例中,您有以下选项:
检查'AllocateTrades2()' - 功能本身
If (bw.CancellationPending) {
e.Cancel = True
return; }
注意:如果您在此处查看,则可以取消“中途”过程。
在运行下一个流程之前从外部检查
If (!worker.CancellationPending) {
MethodX(); }
通常,您应该检查CancellationPending 哪里有意义(例如在循环中:在处理项目之后或之前)。