Страницы

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

суббота, 14 декабря 2019 г.

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

#c_sharp


Есть два кода

Код 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);
тогда эксепш выстреливает. Но почему ?
    


Ответы

Ответ 1



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

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

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