c# - CancellationToken 并未取消所有任务

标签 c# .net-core

.NET 中的 TPL 新手。尝试了解 CancellationToken 以及它们如何收到取消正在执行的任务的信号。下面的代码只传输一个被取消的任务,因为相同的 token 被传递给两个任务。我的假设是如果超时发生在第一个任务上并且它执行 ctx.Cancel() 我需要一些帮助来理解为什么我只看到一个异常,因为两个任务都应该被取消。我缺少什么以及如何确保这两个任务都被取消并且不占用内存资源。

    static void Main(string[] args)
    {
        Console.WriteLine("Starting application");
        var ctx = new CancellationTokenSource();
        var token = ctx.Token;
        try
        {
            var task1 = new Program().Run("task1", token);
            var task2 = new Program().Run("task2", token);

            if (!task1.Wait(1000)) 
                ctx.Cancel();

            task2.Wait();
        }
        catch (AggregateException ex)
        {
            Console.WriteLine("Aggregate Exception occurred");
            foreach (var e in ex.InnerExceptions)
            {
                Console.WriteLine(e.Message);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Main Exception: {e.Message}");
        }
        finally
        {
            Console.WriteLine("Finish Application");
            ctx.Dispose();
        }
    }

    private async Task Run(string name, CancellationToken token)
    {
        while(true)
        {
            if (token.IsCancellationRequested)
            {
                Console.WriteLine("Task Cancelled");
                token.ThrowIfCancellationRequested();
            }
            Console.WriteLine($"Executing {name} ...");
            await Task.Delay(250, token);                
        }
    }

只抛出一个异常,其他任务发生了什么?此外,Console.WriteLine("Task Cancelled") 从未执行过。

输出:

Starting application
Executing task1 ...
Executing task2 ...
Executing task2 ...
Executing task1 ...
Executing task1 ...
Executing task2 ...
Executing task2 ...
Executing task1 ...
Aggregate Exception occurred
A task was canceled.
Finish Application

最佳答案

两件事:

  1. 你应该调用 ex.Flatten().InnerExceptions 查看 this供引用
  2. Task.Delaythrowing而不是您的取消逻辑。尝试将其包装在 try catch 中以进行日志记录。或者,您可以不将 token 传递给 Task.Delay

关于c# - CancellationToken 并未取消所有任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736239/

相关文章:

c# - ComboBox 中只允许不同的值

.net-core - Azure Devops 管道 - 使用 DotNetCoreCLI@2 指定目标框架

file-upload - 在.net core web api中将IFormFile上传到Base64字符串有什么区别吗?

c# - 如何使用 ajax 将嵌套的 json 对象发送到 mvc Controller

c# - HTTP 错误 404.13 - 未找到

c# - Azure AppInsight 日志信息不起作用

c# - 在.Net Core 类库中添加启动类

c# - 如果没有等待最后一个 MoveNextAsync() 任务,IAsyncEnumerator<T>.DisposeAsync() 是否应该抛出异常?

c# - 生成 Expression.Assign 以设置小数点时出现异常?从十进制

sql-server - .Net Core Linux 容器不会使用 SQL 身份验证连接到 SQL Server