c# - 在没有 ThrowIfCancellationRequested 的情况下停止任务

标签 c# multithreading task cancellationtokensource

我有一个任务要取消。

执行此操作的常规方法是使用 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)
{
}

OperationCancelledExceptionWait 被抛出并被捕获方法。但是,如果没有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/

相关文章:

如果它们之间没有 sleep ,c# Task 将无法工作

android - 如何模拟 Android `Tasks.await()` ?

javascript - free-jqGrid(4.15.4),服务器过滤器,客户端排序和分页?

c# - ObjectPool 实现死锁

javascript - Node.js 和 MongoDB - 多个异步数据库操作的原子性?

multithreading - 戈朗 : how to bind code with thread?

java - 设计并编写一个任务调度程序,可以接受不同步或同步的任务

c# - 用于记录分析的滑动时间窗口

c# - 如何注册ServiceBusClient进行依赖注入(inject)?

java - 使用执行服务同时执行多个对象的方法