停止没有ThrowIfCancellationRequested的任务
本文关键字:任务 ThrowIfCancellationRequested | 更新日期: 2023-09-27 18:20:14
我有一项任务要取消。
执行此操作的正常方法是使用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
,以便能够在正确的时间停止长期运行的操作——根据微软的说法。
话虽如此,有没有一种方法可以免除这些毒害我代码的重复调用
我们也知道,当使用时
try
{
task.Wait(cancelToken);
}
catch(OperationCancelledException)
{
}
对于CCD_ 5方法抛出并捕获CCD_。但是,如果不不时进行CancelToken.ThrowIfCancellationRequested()
检查,则任务执行的长操作不会停止。
当异常被捕获等待时,是否有任何方法可以使内部操作停止
您可以将代码重构为循环,以避免每行之间的重复取消:
var actions = new List<Action>()
{
()=>Operation1(),
()=>Operation267(CancelToken),
()=>object232.Operation345(),
//...
};
foreach (var action in actions)
{
action();
CancelToken.ThrowIfCancellationRequested();
}