C# 停止一项任务而不发送取消请求
我有一项任务要取消 执行此操作的常规方法是使用C# 停止一项任务而不发送取消请求,c#,multithreading,task,cancellationtokensource,C#,Multithreading,Task,Cancellationtokensource,我有一项任务要取消 执行此操作的常规方法是使用CancellationToken this.task = new SpecialTask(() => { for (int i = 0; i < ushort.MaxValue; i++) { CancelToken.ThrowIfCancellationRequested(); Console.WriteLine(i); } }, this.CancelToken); 我对对象
CancellationToken
this.task = new SpecialTask(() =>
{
for (int i = 0; i < ushort.MaxValue; i++)
{
CancelToken.ThrowIfCancellationRequested();
Console.WriteLine(i);
}
}, this.CancelToken);
我对对象和方法名使用了随机数,以表明不能创建任何循环
最麻烦的是,我不得不一遍又一遍地编写相同的CancelToken.throwifcancellationrequest()
而且,似乎这还不够,我必须将CancellationToken
拖到我的代码上,以便能够在正确的时间停止长时间运行的操作(根据微软的说法)
话虽如此,有没有一种方法可以避免这些重复调用毒害我的代码?
我们也知道,当使用
try
{
task.Wait(cancelToken);
}
catch(OperationCancelledException)
{
}
对于Wait
方法,将抛出并捕获OperationCanceledException
。但是,如果没有CancelToken.ThrowIfCancellationRequested()
不时检查,则任务执行的长时间操作不会停止
当捕获到等待异常时,是否有任何方法可以使内部操作停止?您可以将代码重构为循环,以避免每行之间的重复取消:
var actions = new List<Action>()
{
()=>Operation1(),
()=>Operation267(CancelToken),
()=>object232.Operation345(),
//...
};
foreach (var action in actions)
{
action();
CancelToken.ThrowIfCancellationRequested();
}
var actions=新列表()
{
()=>操作1(),
()=>操作267(取消令牌),
()=>object232.Operation345(),
//...
};
foreach(行动中的var行动)
{
动作();
CancelToken.ThrowIfCancellationRequested();
}
See的可能重复简言之,您不需要。您要么需要这样做,要么根本无法取消任务。也就是说,您可以对该代码进行一些重构,以避免重复。虽然我确实理解确保长时间运行的操作在正确的时间停止的必要性,但我希望该框架在较低的级别上有一些内置的机制,可以很好地取消。不过,我会尽快查看您提供的链接。谢谢@保罗:系统无法知道何时是停止的好时机或坏时机;你需要告诉它。这需要我想象更精细的粒度来将代码分离成方法。我几乎被迫分成更小的方法,而不是有3个好的实体方法,以便很快捕捉到取消。从一个地方删除一个代码,然后在其他地方添加另一个代码,这是行不通的do@Paul您仍然可以将取消令牌传递到方法中,并在这些方法中执行相同的操作,以便仍然允许将代码重构到方法中。
var actions = new List<Action>()
{
()=>Operation1(),
()=>Operation267(CancelToken),
()=>object232.Operation345(),
//...
};
foreach (var action in actions)
{
action();
CancelToken.ThrowIfCancellationRequested();
}