0

这就是我设置后台工作人员的方式

问题是:如何中途终止进程?我必须创建一个取消按钮来停止当前的处理。

我想使用下面的行...

if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                }

...并在内部封装 AllocateTrades2 方法,但这意味着我必须从其他地方调用取消标志,并且只有在方法完成处理后才会检查它。

而且我不能只是“假装”它没有做任何事情,因为如果用户再次单击相同的操作,则会引发异常,表明工作人员正在使用中。

我想做的一个例子:

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

4

2 回答 2

3

你必须做类似的事情......

public void AllocateTrades()
{
    if (!worker.CancellationPending)
    {
        Method1();
    }

    if (!worker.CancellationPending)
    {
        Method2();
    }

    if (!worker.CancellationPending)
    {
        Method3();
    }
}

.Net 无法为您决定关于您的后台工作什么是“原子”操作,因此您必须决定检查待处理取消的频率和位置。

于 2013-05-22T15:42:08.077 回答
0

答案是肯定的。

无论您在哪里检查 'CancellationPending',都可以停止您的 worker

在您的示例中,您有以下选项:

  • 签入“AllocateTrades2()”-函数本身

     If (bw.CancellationPending) {
        e.Cancel = True
        return; }
    

注意:如果您在此处选中,则可以“中途”取消该过程。

  • 在运行下一个过程之前从外部检查

     If (!worker.CancellationPending) {
        MethodX(); }
    

通常,您应该在任何有意义的地方检查 CancellationPending (例如在循环中:在处理项目之后或之前)。

于 2013-05-22T15:42:05.240 回答