Я пытался выяснить, почему я получаю TaskCanceledException для небольшого количества асинхронного кода, который недавно начал плохо себя вести. Я сократил свою проблему до небольшого фрагмента кода, который заставляет меня чесать голову:
static void Main(string[] args)
{
RunTest();
}
private static void RunTest()
{
Task.Delay(1000).ContinueWith(t => Console.WriteLine("{0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted).Wait();
}
Насколько мне известно, это должно просто остановиться на секунду, а затем закрыть. ContinueWith не будет вызываться (это относится только к моему фактическому варианту использования). Однако вместо этого я получаю TaskCanceledException и понятия не имею, откуда оно взялось!
2 ответа
Вы используете неправильные варианты продолжения задачи:
См. Следующую ссылку: https : //msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions%28v=vs.110%29.aspx
Он говорит: указывает, что задача продолжения должна быть запланирована только в том случае, если ее предшествующая задача вызвала необработанное исключение. Этот вариант не подходит для продолжений многозадачности.
Как ребята сказали выше, для этого вызова требуется только antecedent-task в статусе ошибки, в противном случае будет выброшено TaskCanceledException, для этого конкретного случая вы можете обобщить ContinueWith для обработки всех статусов:
await Task.Delay(1000).ContinueWith(
task =>
{
/* take into account that Canceled-task throw on next row the TaskCancelledException */
if (!task.IsFaulted) {
return;
}
Console.WriteLine("{0}", task.Exception);
// do smth like 'throw task.Exception.InnerException'
});
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.