Страницы

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

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

Task не запускает метод

#c_sharp


Всем привет. Подскажите пожалуйста, почему в этом коде на выходе пустой экран.

class a
{
    static void Meth(int x, int y)
    {
        Console.WriteLine(x + y);
    }
    static void Main()
    {
        Task t = new Task(() => Meth(5, 4));
        t.Start();
    }
}


Что особенно меня удивило, что через пошаговую отладку, компилятор вообще не заходит
в метод Meth. Почему ?
    


Ответы

Ответ 1



Дело вот в чём. t.Start запускает Task на текущем TaskScheduler'е. Поскольку вы запускаете из не-UI-потока, у вас в нём работает TaskScheduler по умолчанию — тот, который выполняет Task в thread pool'е. Затем, что происходит сразу после запуска задания? Main завершается, и программа умирает, не успев выполнить задание. Задание уходит в thread pool, но программа успевает завершиться до начала выполнения задания. Потоки thread pool'а не приостанавливают завершение программы, если функция Main завершается, то при этом завершается вся программа. Попробуйте t.Wait() после t.Start().

Ответ 2



Этот код не успевает выполниться, так как программа завершает работу. Попробуй так: class Program { static void Meth(int x, int y) { Console.WriteLine(x + y); } static void Main() { Task task = new Task(() => Meth(5, 4)); task.Start(); task.Wait(); //Console.ReadKey(); } }

Ответ 3



Иногда задачу (скорее задачу ContinueWith) хорошо выполнить в том же потоке, что и пользовательский интерфейс. class Program { static void Meth(int x, int y) { Console.WriteLine(x + y); } static void Main() { SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); Task.Factory .StartNew( () => Meth(5, 4) ,CancellationToken.None ,TaskCreationOptions.None ,TaskScheduler.FromCurrentSynchronizationContext() ); //Console.ReadKey(); } } Когда я делал так в WPF, то SetSynchronizationContext устанавливать не надо было.

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

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