Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

Почему не генерируется исключение

Есть два кода
Код 1
static void Main() { Task.Factory.StartNew((o) => { int x = 5 /(int) o; }, 0); System.Threading.Thread.Sleep(500); }
Код 2
class a { public void Foo(object x) { int y = 5 /(int) x; } } class b { static void Main() { a A = new a(); System.Threading.Thread t = new System.Threading.Thread(A.Foo); t.Start(0); } }
Как видно из них, то в обоих случаях происходит попытка деления на нуль, однако почему в КОДЕ 1 не происходит выбрасывания эксепшина, а в Коде 2 происходит ? Ведь что первый, что второй метод запускаются в разных потоках. Объясните пожалуйста
Add:
Если добавить такую строчку в Коде 1 вместо Thread.Sleep() - Task.WaitAll(t); тогда эксепш выстреливает. Но почему ?


Ответ

Второй код использует class Thread, первый код использует class Task для запуска кода в другом потоке.
При появлении исключения, поведение по умолчанию для Thread-а - завершить программу, поведение по умолчанию для Task - перехватить исключение и сохранить его в Task.
Если исключение возникло при выполнении Task, то await, t.Wait и Task.WaitAll распаковывают исключение из Task и кидают его в текущем потоке.

Комментариев нет:

Отправить комментарий