我有一项我想取消的任务。
执行此操作的常规方法是使用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
遍布我的代码只是为了能够在合适的时间停止长时间运行 - 根据微软的说法。 / p>
话虽如此,有没有办法可以免除这些重复的电话,这会使我的代码中毒?
我们也知道,使用时
try
{
task.Wait(cancelToken);
}
catch(OperationCancelledException)
{
}
OperationCancelledException
抛出并Wait
方法。但是,如果不时没有CancelToken.ThrowIfCancellationRequested()
项检查,则任务执行的长时间操作不会停止。
当等待捕获到异常时,是否有可能使内部操作停止?
答案 0 :(得分:2)
您可以将代码重构为循环,以避免每行之间重复取消:
var actions = new List<Action>()
{
()=>Operation1(),
()=>Operation267(CancelToken),
()=>object232.Operation345(),
//...
};
foreach (var action in actions)
{
action();
CancelToken.ThrowIfCancellationRequested();
}