Есть два кода
Код 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 и кидают его в текущем потоке.
Комментариев нет:
Отправить комментарий