【问题标题】:Terminating Background Worker from a different class从不同的类中终止后台工作人员
【发布时间】:2013-05-22 14:45:38
【问题描述】:

This is how I set up my Background Worker

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

我想用下面这行...

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

【问题讨论】:

    标签: c# winforms backgroundworker


    【解决方案1】:

    你必须做类似...

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

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

    【讨论】:

    • 这可能是一个矫枉过正(取决于项目的大小和检查的地方的数量),但这看起来像样板和重复代码,我会创建一个方面并将检查移动到挂起取消。
    • 没有完全一样的结构,但是检查每个方法的想法是一样的。 +1 并被接受。
    【解决方案2】:

    答案是

    无论您在何处检查“CancellationPending”,您都可以停止您的工作人员

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

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

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

    注意:如果在这里勾选,可以“中途”取消进程。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多