gpt4 book ai didi

c# - Task.WaitAll 上的 System.AggregateException

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

我有以下代码触发了一些异步任务。

        List<TimeoutException> TimeoutExceptions = new List<TimeoutException>();
List<TaskCanceledException> TaskCanceledExceptions = new List<TaskCanceledException>();
List<Exception> Exceptions = new List<Exception>();
List<AggregateException> AggregateExceptions = new List<AggregateException>();

List<Models.Channel.IChannel> channels = new List<Models.Channel.IChannel>();
channels.Add(new Models.Channel.DummyChannelName());

var tasks = new List<Task>();
foreach (Models.Channel.IChannel channel in channels)
{
try
{
var cts = new CancellationTokenSource();
cts.CancelAfter(channel.TimeOut);

tasks.Add(Task.Run(() =>
{
channel.Data = channel.RequestOffers(new Models.Request.AvailabilityRequest()).Result;

if (cts.Token.IsCancellationRequested)
cts.Token.ThrowIfCancellationRequested();

}, cts.Token));
}
catch (TimeoutException t)
{
TimeoutExceptions.Add(t);
}
catch (TaskCanceledException tc)
{
TaskCanceledExceptions.Add(tc);
}
catch (AggregateException ae)
{
AggregateExceptions.Add(ae);
}
catch(Exception ex)
{
Exceptions.Add(ex);
}

}

Task.WaitAll(tasks.ToArray(), TimeSpan.FromSeconds(5));

我遇到的问题是,如果任务因超时而被取消,我会收到以下异常

<ExceptionMessage>One or more errors occurred.</ExceptionMessage>
<ExceptionType>System.AggregateException</ExceptionType>

这只是一个简单的案例,我需要围绕 Task.WaitAll 进行 Try Catch,还是我的代码应该采用不同的结构。

最佳答案

如果任务内部发生异常,则当您等待 任务时,调用线程会引发异常。如果任务成功创建,则任务内发生的所有异常都将包装在 AggregateException 中并在等待时抛出。

对于您的示例,这意味着您可以删除循环中的 try/catch block ,并使用它在循环后包装 Task.WaitAll(...)

var tasks = new List<Task>();
foreach (Models.Channel.IChannel channel in channels)
{
Task myTask = Task.Run(...); // create your task here
tasks.Add(myTask);
}

try
{
Task.WaitAll(tasks.ToArray(), TimeSpan.FromSeconds(5));
}
catch
{
// Insert Exception handling logic
}

关于c# - Task.WaitAll 上的 System.AggregateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170242/

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