从它调用的方法中从BackgroundWorker返回

时间:2012-10-24 14:17:56

标签: c# winforms backgroundworker

我有BackgroundWorker调用方法调用方法...在我检查CancellationPending的行的某处,并想要退出BackgroundWorker

有没有办法直接从深层嵌套的方法做到这一点,还是必须返回其调用者,然后调用者将返回其调用者......?

4 个答案:

答案 0 :(得分:4)

您正在使用BackgroundWorker这一事实并没有什么特别之处 - 用与处理深层嵌套方法调用相同的术语来考虑这一点。

换句话说,不,没有(非可怕的)方式我可以想到直接这样做。

我能想到的最简洁的方法是在每个级别(以及CancellationPending返回)从每个嵌套方法返回后立即检查true

抛出一个特定的异常并在顶层捕获相同的特定异常类型会让你快速离开,但这不是最佳实践(也就是说,不要使用任何非异常的异常,例如正常的流控制)。 / p>

答案 1 :(得分:3)

  

一个BackgroundWorker,它调用一个调用方法的方法......

     

有没有办法直接从深层嵌套的方法

中取消[取消]

你可以抛出异常。但这与仅使用错误例外的一般建议相矛盾。

答案 2 :(得分:0)

你可以,但你不应该。

除了在其他答案中提到的抛出异常之外,没有人敢说出的名字是Thread.Abort()。如果从BackgroundWorker线程上执行的函数调用此函数,则整个线程将退出。已经讨论了Thread.Abort()的邪恶elsewhere on this site

话虽这么说,正确的做法是构造你的代码,这样当一个深层嵌套的函数决定线程应该退出时,这个意图就会被传回堆栈的主线程方法,然后可以退出干净利落地

答案 3 :(得分:0)

有很多种方法,我更喜欢这种实现,虽然它稍微限制了一些参数,但你可以改变它。重点是您将引用传递给BackgroudWorker作为参数:

bkgw = new BackgroundWorker();
bkgw.DoWork += new DoWorkEventHandler(bkgw_DoWork);
bkgw.WorkerSupportsCancellation = true;



void bkgw_DoWork(object sender, DoWorkEventArgs e)
{
        BackgroundWorker b = (BackgroundWorker)sender;
        if (b.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
        if (!Method1(b))
        {
            e.Cancel = true;
            return;
        }
        if (b.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

}

bool Method1(BackgroundWorker caller)
{
    //some code
    if (caller.CancellationPending)
        return false;
    if (!Method2(caller))
        return false;
    //some code
    return true;
}
bool Method2(BackgroundWorker caller)
{
    //some code
    if (caller.CancellationPending)
        return false;
    //some code
    return true;
}