簡體   English   中英

如何在 C# 中捕獲任務異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM