Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停止一项任务而不发送取消请求_C#_Multithreading_Task_Cancellationtokensource - Fatal编程技术网

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();
}