Отслеживание исключений в многопоточных C # с помощью задач - PullRequest
2 голосов
/ 25 февраля 2011

Я запускаю метод для списка входов;этот список предоставляется пользователем.Если исключение происходит при обработке одного ввода, я должен удалить это из таблицы вывода.Код выглядит примерно так:

List<Task> methodsList = new List<Task>();
for (int i = 0; i < inputList.Count; i++)
{
    int arg = i;
    Task newTask = Task.Factory.StartNew(() => ProcessInput(i));
    methodsList.Add(newTask);
}
if (methodsList.Count != 0)
{
    try
    {
        Task.WaitAll(methodsList.ToArray());
    }
    catch (AggregateException ex)
    {
        foreach (Exception innerEx in ex.InnerExceptions)
        {
            throw innerEx;
        }
    }
}

Проблема состоит в том, что когда я жду завершения всех задач, AggregatedException не дает мне никакой информации о том, какой поток был сбой.Я думал о том, как справиться с этим, создав коллекцию и добавив в этот список индекс готовых процессов и проверив его в конце, чтобы увидеть, какие входные данные не обработаны, но мне было интересно, есть ли более простой способ сделать это.*

1 Ответ

7 голосов
/ 25 февраля 2011

Да, есть более простой способ - обработать исключение в самой задаче. Попытки справиться с этим, когда все состояние исчезнет, ​​практически невозможно. Выполнение этого в задаче все еще является трудоемкой, но, по крайней мере, у вас будет гораздо лучшее представление о том, что пошло не так.

...