Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在终止来自不同类的后台工作程序_C#_Winforms_Backgroundworker - Fatal编程技术网

C# 正在终止来自不同类的后台工作程序

C# 正在终止来自不同类的后台工作程序,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,问题是:如何中途终止流程?我必须创建一个取消按钮来停止当前的处理 我想用下面这句话 if ((worker.CancellationPending == true)) { e.Cancel = true; } …并将AllocateTrades2方法封装在内部,但这意味着我必须从其他地方调用Cancel标志,并且只有在该方法完成处理后,它才会检查它 我不能只是“假装”它没有做任何事情,因为如

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

我想用下面这句话

if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                }
…并将AllocateTrades2方法封装在内部,但这意味着我必须从其他地方调用Cancel标志,并且只有在该方法完成处理后,它才会检查它

我不能只是“假装”它没有做任何事情,因为如果用户再次单击同一个操作,将抛出一个异常,说明该工作程序正在使用

我想做的一个例子:

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()停止所有处理,并使其自身可用于将来的调用。我想做的是可能的吗?

答案是

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

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

  • 签入'AllocateTrades2()'-函数本身

     If (bw.CancellationPending) {
        e.Cancel = True
        return; }
    
注意:如果您在此处选中,您可以“中途”取消流程

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

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

通常,只要有意义,您应该检查CancellationPending(例如,在循环中:在处理项目之后或之前)

答案是肯定的

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

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

  • 签入'AllocateTrades2()'-函数本身

     If (bw.CancellationPending) {
        e.Cancel = True
        return; }
    
注意:如果您在此处选中,您可以“中途”取消流程

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

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

通常,只要有意义,您应该检查CancellationPending(例如,在循环中:在处理项目之后或之前)

你必须做一些像

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

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

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

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

您必须执行以下操作:

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

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

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

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

这可能是一种过度操作(取决于项目的大小和检查位置的数量)但这看起来像样板和重复代码,我会创建一个方面,并在其中移动对挂起取消的检查。没有完全相同的结构,但检查每个方法的想法是相同的+1并被接受。这可能有点过分(取决于项目的规模和检查的地方的数量),但这看起来像样板和重复代码,我会创建一个方面,并在其中移动待取消的检查。没有完全相同的结构,但检查每个方法的想法是相同的+1并接受。