Цитаты MSDN: любые необработанные исключения удобно перебрасываются в поток хоста, даже если вы не вызываете Wait для объекта задачи - PullRequest
0 голосов
/ 16 апреля 2020

В приведенном ниже коде необработанное исключение для метода Go () не возвращается обратно в поток хоста. это тихо игнорируется.

static void Main()    // The Task class is in System.Threading.Tasks
{
    Task taskObj = Task.Factory.StartNew (Go);

    Thread.Sleep(2000);
    Console.WriteLine("Executing on Main thread")
    Console.ReadLine();
}

static void Go()
{
    Console.WriteLine ("In the thread pool!");
    throw new Exception();
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Информация, скопированная Джозефом Албахари и Беном Албахари C# 4.0 в двух словах: окончательная ссылка устарела. Поведение исключений по умолчанию для ненаблюдаемых исключений было изменено с NET 4.0 на 4.5. Цитата из Обработка исключений задач. NET 4.5 от Стивена Туба, 28 сентября 2011 г .:

Чтобы разработчикам было проще писать асинхронный код на основе задач,. NET 4.5 изменяет поведение исключений по умолчанию для ненаблюдаемых исключений. Хотя ненаблюдаемые исключения по-прежнему будут вызывать событие UnobservedTaskException (в противном случае это будет критическое изменение), процесс по умолчанию не обработает sh. Скорее, исключение в конечном итоге будет съедено после возникновения события, независимо от того, наблюдает ли обработчик события исключение. Это поведение можно настроить, хотя. Новый флаг конфигурации CLR может использоваться для возврата к аварийному поведению. NET 4.

Кстати, более новая версия этой книги, охватывающая C# 6 и. NET 4.6, опубликовано теми же авторами.

0 голосов
/ 16 апреля 2020

Как описано в документации, вам нужно вызвать wait для объекта задачи, чтобы перехватить любое исключение в задаче. С исправлением кода ниже основной поток сможет перехватить исключение.

try
{
    Task taskObj = Task.Factory.StartNew(Go);

    Thread.Sleep(2000);
    Console.WriteLine("Executing on Main thread");

    taskObj.Wait();
    Console.ReadLine();
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

static void Go()
{
    Console.WriteLine("In the thread pool!");
    throw new Exception();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...