如何在c#中捕获Task异常



我想捕获一批任务的所有任务异常,但我找不到最佳解决方案。也许有人能帮帮我?

我有一个函数,声明如下:

public async Task CreateBooking(CreateBookingModel createBookingModel)

在此方法中可以执行

抛出异常如果我像这样创建一个foreach:

foreach (DateTime day in EachDay(originalStartDate, originalEndDate))
{
createBookingModel.StartDate = day;
createBookingModel.EndDate = day;
try
{
CreateBooking(createBookingModel);
}
catch (Exception ex)
{
raiseToTeams(ex, "Creation error");
}
}

我没有收到任何其他如果创建抛出异常。我试着让它:

List<Task> tasks = new List<>();
foreach (DateTime day in EachDay(originalStartDate, originalEndDate))
{
createBookingModel.StartDate = day;
createBookingModel.EndDate = day;
tasks.Add(CreateBooking(createBookingModel));              
}
try
{
Task.WaitAll(tasks.toArray());
}
catch(AggregateException ex)
{
ex.InnerExceptions.ForEach(subExp =>
{
if (subExp is ExternalBookingException)
{
raiseToTeams(subExp, "Creation error");
}
});
}

但是我有2个问题,如果只有一个异常发生,没有问题,我在聚合中捕获它,如果多于一个,我甚至在异常上也没有捕获任何东西,而不是简单的聚合捕获。如果在WaitAll()之前添加的每个Task都完成了,那么行将无限阻塞,这是我不想要的!

谁有解决方案吗?

注意,

CreateBooking(createBookingModel);

just启动Task并返回它。为了得到Task结果你应该await它:

try
{
// await - start task and await for its completion
await CreateBooking(createBookingModel);
}
catch (Exception ex)
{
raiseToTeams(ex, "Creation error");
}

同样,如果你有几个任务要完成:

List<Task> tasks = new List<>();
foreach (DateTime day in EachDay(originalStartDate, originalEndDate))
{
createBookingModel.StartDate = day;
createBookingModel.EndDate = day;
tasks.Add(CreateBooking(createBookingModel));              
}
try
{
// Note WhenAll instead of WaitAll
// Note await
await Task.WhenAll(tasks);
}
catch (Exception ex) // <- Note plain exception, not AggregatedException
{
...

最新更新