终止背景工作者从另一个班级

时间:2013-05-22 14:45:39

标签: c# winforms backgroundworker

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()会停止所有处理,并使其可用于将来的调用。我正在尝试做什么?

2 个答案:

答案 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 哪里有意义(例如在循环中:在处理项目之后或之前)。