[英]How to catch Task exception in C#
我想捕獲一批任務的所有任務異常,但我沒有找到最好的解決方案。 也許有人可以幫助我嗎?
我有一個具有以下聲明的函數:
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() 之前添加的每個任務完成,該行無限地阻塞,我不想要!
有人有解決方案嗎?
注意
CreateBooking(createBookingModel);
只是啟動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
{
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.