C # Task.When Все исключения - PullRequest
       38

C # Task.When Все исключения

0 голосов
/ 08 октября 2018

Мне нужна помощь с простым Task.When Все C # кода.У меня одновременно выполняется до 50 различных задач, однако некоторые из этих вызовов могут возвращать сообщение об ошибке.

Я пытаюсь написать код обработки исключений, чтобы я мог обработать те, которые работали(что он делает), но фиксирует те, которые допустили ошибку, поэтому я могу выполнить дополнительный код для них.

Существует AggregateException, но есть ли способ увидеть, какие вызовы / входы создали это исключение?

Я не могу поделиться действительным кодом из-за строгой политики компании, но пример таков:

List<ListDetails> libs = getListDetails();
var tasks = new Task<List<ItemDetails>>[libs.Count];
for (int i = 0; i < libs.Count; i++)
{
    tasks[i] = getListItems(libs[i].ServerRelativeUrl, libs[i].ListId);
}

try
{
    await Task.WhenAll(tasks);
}
catch(AggregateException aex)
{
    //Capture which Server RelativeUrls and ListIDs that failed.    
}

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы можете запросить исходные задачи после ожидания:

var myTasks = ...;

 try {
     await Task.WhenAll(myTasks);
  }
  catch (AggregateException) {
     //swallow everything
  }

foreach (var task in myTasks) {
 if (myTask.Status == RanToCompletion)
  ...
}
0 голосов
/ 08 октября 2018

Вы должны создать массив асинхронных задач, затем, когда вы собираетесь добавить каждую задачу в массив, вы должны поместить анонимную функцию с лямбда-выражением в ContinueWith () {}.Вот пример:

var tasks = new List<Task>(); 
tasks.add(t.ContinueWith(o =>
{
    if(o.IsFaulted){
        Console.WriteLine(o.Exception?.InnerException);
        return;
        }

        Console.WriteLine(o.Result);
  }));

 tasks.WhenAll().ContinueWith(o=>{

Console.WriteLine("All Done!")
});
0 голосов
/ 08 октября 2018

Вы должны проверить свойство InnerExceptions, или вы можете использовать метод AggregateException.Flatten, как показано в документе:

try {
     task1.Wait();
  }
  catch (AggregateException ae) {
     foreach (var e in ae.Flatten().InnerExceptions) {
        if (e is CustomException) {
           Console.WriteLine(e.Message);
        }
        else {
           throw;
        }
     }
  }

Это даст вам все исключения, которыеброшенные дочерними задачами, но, к сожалению, нет способа узнать, какая задача вызвала конкретное исключение.Вам нужно будет исследовать следы стека.

...