gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:56:28 25 4
gpt4 key购买 nike

.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com