我有一个任务要取消。
执行此操作的常规方法是使用 CancellationToken
.
this.task = new SpecialTask(() =>
{
for (int i = 0; i < ushort.MaxValue; i++)
{
CancelToken.ThrowIfCancellationRequested();
Console.WriteLine(i);
}
}, this.CancelToken);
然而,在现实世界中,事情绝非如此简单。 我们的异步代码无法循环,看起来像这样:
this.task = new SpecialTask(() =>
{
CancelToken.ThrowIfCancellationRequested();
Operation1();
CancelToken.ThrowIfCancellationRequested();
Operation267(CancelToken);
CancelToken.ThrowIfCancellationRequested();
object232.Operation345();
CancelToken.ThrowIfCancellationRequested();
object99.Operation44(CancelToken);
CancelToken.ThrowIfCancellationRequested();
Operation5(CancelToken);
...
CancelToken.ThrowIfCancellationRequested();
Operation...n(CancelToken);
}, this.CancelToken);
我对对象和方法名称使用了随机数,以表明无法创建任何循环。
最麻烦的是我必须一直写同样的 CancelToken.ThrowIfCancellationRequested()
一遍又一遍。
而且,好像这还不够,我必须拖动 CancellationToken
根据 Microsoft 的说法,我的所有代码只是为了能够在正确的时间停止长时间运行的操作。
话说回来,有没有什么办法可以免除这些毒害我的代码的重复调用?
我们也知道,在使用的时候
try
{
task.Wait(cancelToken);
}
catch(OperationCancelledException)
{
}
OperationCancelledException
为 Wait
被抛出并被捕获方法。但是,如果没有CancelToken.ThrowIfCancellationRequested()
,则任务执行的长操作不会停止。不时检查。
有没有什么办法可以在等待异常被捕获时让内部操作停止?
最佳答案
您可以将您的代码重构为一个循环,以避免每行之间的重复取消:
var actions = new List<Action>()
{
()=>Operation1(),
()=>Operation267(CancelToken),
()=>object232.Operation345(),
//...
};
foreach (var action in actions)
{
action();
CancelToken.ThrowIfCancellationRequested();
}
关于c# - 在没有 ThrowIfCancellationRequested 的情况下停止任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367969/