我有一个BackgroundWorker
调用方法的方法,该方法调用了一个方法……并且在某处我检查CancellationPending
并想要退出BackgroundWorker
.
有没有办法直接从那个深度嵌套的方法中做到这一点,或者它是否必须返回它的调用者,而调用者又会返回给它的调用者......?
我有一个BackgroundWorker
调用方法的方法,该方法调用了一个方法……并且在某处我检查CancellationPending
并想要退出BackgroundWorker
.
有没有办法直接从那个深度嵌套的方法中做到这一点,或者它是否必须返回它的调用者,而调用者又会返回给它的调用者......?
您使用 a 的事实并没有什么特别之处BackgroundWorker
- 用与处理深度嵌套方法调用相同的术语来考虑这一点。
换句话说,不,我想不出(非可怕的)方法可以直接做到这一点。
我能想到的最简洁的方法是CancellationPending
在从每个嵌套方法返回后立即检查,在每个级别(以及 if true
,返回)。
抛出特定异常并在顶层捕获相同的特定异常类型可以让您快速退出,但这并不是最佳实践(也就是说,不要使用任何非异常的异常,例如正常的流控制)。
调用方法的BackgroundWorker 调用方法...
有没有办法直接从那个深度嵌套的方法中[取消]
你可以抛出一个异常。但这与仅对错误使用异常的一般建议相近。
你可以,但你不应该。
除了其他答案中提到的抛出异常之外,没有人敢说的邪恶是Thread.Abort()。如果您从在 BackgroundWorker 线程上执行的函数中调用它,则整个线程将退出。Thread.Abort() 的弊端已在本网站的其他地方详细讨论过。
话虽这么说,正确的做法是构建您的代码,以便当深度嵌套的函数决定线程应该退出时,这个意图会在堆栈中传播到主线程方法,然后可以干净地退出
有很多方法,我更喜欢这个实现,虽然它限制了一点参数,但你可以改变它。要点是您将引用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;
}