Якщо ви створили Завдання, і ви ніколи не дзвоните task.Wait()
або не намагаєтеся отримати результат Task<T>
, коли завдання збирається сміттєзбірником, воно зірве вашу програму під час завершення. Докладніше див. На сторінці MSDN про обробку винятків у TPL .
Найкращий варіант тут - "обробляти" виняток. Це можна зробити через продовження - ви можете приєднати продовження до завдання, а також увімкнути / проковтнути / тощо виняток, що виникає. Це забезпечує чіткий спосіб реєстрації винятків із завдання, і їх можна записати як простий метод розширення, тобто:
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
З урахуванням вищезазначеного ви можете запобігти зірванню програми та реєстрації програми будь-яким завданням за допомогою:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Крім того, ви можете підписатися на TaskScheduler.UnobservedTaskException і обробити його там.
Off
в класі, названому як чотирибуквене слово на ваш вибір, і використовуйте це для свого продовження. Допомагає боротися з деякими невдоволеними розчаруваннями від цього винятку.