C# 在BackgroundWorker中是否有一种干净的方法可以检查取消请求,而无需反复键入相同的代码?

C# 在BackgroundWorker中是否有一种干净的方法可以检查取消请求,而无需反复键入相同的代码?,c#,C#,如果我想定期检查是否有取消请求,我会在DoWork事件处理程序中不断使用以下代码: if(w.CancellationPending == true) { e.Cancel = true; return; } 是否有一种干净的方法可以检查C#中的BackgroundWorker中的取消请求,而无需反复键入相同的代码 请参考以下代码: void worker_DoWork(object sender, DoWorkEventArgs e

如果我想定期检查是否有取消请求,我会在DoWork事件处理程序中不断使用以下代码:

    if(w.CancellationPending == true)
    {
        e.Cancel = true;
        return;
    }  
是否有一种干净的方法可以检查C#中的
BackgroundWorker
中的取消请求,而无需反复键入相同的代码

请参考以下代码:

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    ...

    BackgroundWorker w = sender as BackgroundWorker;

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

    some_time_consuming_task...

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

    another_time_consuming_task...

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

    ...
}

使用while循环和委托

将任务添加到代理列表中,然后在循环中测试您的条件

您可以使用操作自定义委托简化此任务(请参阅:)

void worker\u DoWork(对象发送方,DoWorkEventArgs e)
{
列表委托=新列表();
添加(一些耗时的任务);
添加(另一项耗时的任务);
BackgroundWorker w=发送方作为BackgroundWorker;
而(!w.CancellationPending&&delegate.Count!=0)
{
代表[0]();
删除(0);
}
如果(w.CancellationPending)
e、 取消=真;
}

也许可以将您的工作程序设置为状态机,然后您可以在(!w.CancellationPending){switch(\u someSwitch)…}将方法拆分为委托时执行
。让我们假设
Action[]
然后在
Actions
内部循环中检查
如果(w.CancellationPending){e.Cancel=true;return;}
将其提取到一个helper方法中。@usr如果您不能将其提取到一个helper方法中,您不能从调用方法中返回一个方法,那么您最多只能是
如果(Foo(w,e))return
稍微好一点,但不是真的好。这在什么方面不好?它将4行转换为一行,并将不重要的内容抽象掉。我认为这实际上是一个合理的解决方案,而OPs代码不是。
void worker_DoWork(object sender, DoWorkEventArgs e)
{
    List<Action> delegates = new List<Action>();
    delegates.add(some_time_consuming_task);
    delegates.add(another_time_consuming_task);

    BackgroundWorker w = sender as BackgroundWorker;    
    while(!w.CancellationPending && delegate.Count!=0)
    {
        delegates[0]();
        delegates.remove(0);
    }

    if(w.CancellationPending)
        e.Cancel = true;
}