2

我有一个BackgroundWorker调用方法的方法,该方法调用了一个方法……并且在某处我检查CancellationPending并想要退出BackgroundWorker.

有没有办法直接从那个深度嵌套的方法中做到这一点,或者它是否必须返回它的调用者,而调用者又会返回给它的调用者......?

4

4 回答 4

4

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

换句话说,不,我想不出(非可怕的)方法可以直接做到这一点。

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

抛出特定异常并在顶层捕获相同的特定异常类型可以让您快速退出,但这并不是最佳实践(也就是说,不要使用任何非异常的异常,例如正常的流控制)。

于 2012-10-24T14:20:25.010 回答
3

调用方法的BackgroundWorker 调用方法...

有没有办法直接从那个深度嵌套的方法中[取消]

你可以抛出一个异常。但这与仅对错误使用异常的一般建议相近。

于 2012-10-24T14:20:36.607 回答
0

你可以,但你不应该。

除了其他答案中提到的抛出异常之外,没有人敢说的邪恶是Thread.Abort()。如果您从在 BackgroundWorker 线程上执行的函数中调用它,则整个线程将退出。Thread.Abort() 的弊端已在本网站的其他地方详细讨论过。

话虽这么说,正确的做法是构建您的代码,以便当深度嵌套的函数决定线程应该退出时,这个意图会在堆栈中传播到主线程方法,然后可以干净地退出

于 2012-10-24T14:28:04.483 回答
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;
}
于 2012-10-24T14:35:00.963 回答