Один из вариантов - присоединить к вашей задаче другую задачу как «обработчик» для обработки любых исключений.
Вот пример:
var task = Task.Factory.StartNew(() =>
{
throw new Exception("oops!");
});
// attach an exception-handling task
task.ContinueWith(previousTask =>
{
// do something with the exception
Console.WriteLine(previousTask.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);
Обратите внимание, что задача, прикрепленная с ContinueWith
, имеет TaskContinuationOptions.OnlyOnFaulted
, что означает, что она будет выполняться только в том случае, если задача, к которой она прикреплена, выдает исключение.
Таким образом, ваши исключения могут обрабатываться асинхронно, и вам не нужно ничего ждать.
Однако, так как вы хотите провести параллель для цикла, я бы, вероятно, сделал что-то вроде:
Task.Factory.StartNew(() =>
{
try
{
Parallel.For(..., i =>
{
...
});
}
catch (AggregateException e)
{
// handle it somehow
}
});
Таким образом, ваша основная задача ожидает выполнения всех дочерних задач, но поток пользовательского интерфейса, который ее породил, не должен ждать.
Главное, в чем вы должны быть уверены, это то, что ваше предложение catch
(или задача обработки в предыдущем примере) никогда не вызывает исключение.