Завершается ли Задача, если вы закрываете приложение? - PullRequest
0 голосов
/ 09 мая 2020

Итак, у меня в основном это:

public void DoThisThing()
{
    Task.Run(() =>
    {
        while(true)
        {
            //Do things
        }
    }
}

Запуск приложения в основном вызывает метод DoThisThing () и вводит его собственный l oop.

Итак, если я просто закройте приложение, что происходит с этой задачей? Это просто конец? это продолжается вечно? Включен ли go ненадолго, пока его не достанет сборщик мусора? Есть ли способ узнать, что приложение закончилось?

Я погуглил, но не смог получить простого ответа, и мне кажется, что он определенно есть.

Ответы [ 4 ]

0 голосов
/ 09 мая 2020

Кратко на основе вашего образца: Да

Задачи, созданные TPL (с использованием Task.Run или Task.Factory.StartNew), по умолчанию являются фоновыми потоками. Таким образом, закрытие приложения немедленно прекратит их работу.

Этот пост может быть полезен.

0 голосов
/ 09 мая 2020

Первый вопрос, как вообще выполняется эта задача. Согласно документации :

Ставит в очередь указанную работу для запуска в ThreadPool и возвращает задачу или дескриптор задачи для этой работы.

Каждый программа начинается с одного потока, но может начинаться и дальше. Это основной поток, поток GUI и несколько других имен. Как правило, если этот основной поток завершается, все остальные запущенные потоки также отменяются. Это правило уровня ОС, чтобы избежать Zomb ie потоков с бесконечными циклами, выполняющимися повсюду.

ThreadPool и все его данные, включая запланированные и запущенные потоки, будут собираться "Конец Приложение «Сборщик мусора. Если нет, вероятно, есть некоторые функции ОС, чтобы они тоже закончились. Но я предпочитаю не упоминать об этих резервных версиях ОС, так как нам действительно не следует их использовать. Бывают случаи, когда даже G C не может долго работать должным образом (например, программа убивается через диспетчер задач).

Одной из больших проблем многозадачности и потоковой передачи является сохранение основной поток активен, но не блокирует его, поэтому может происходить дальнейший ввод-вывод. В GUI эта работа сделана за вас (с помощью EventQueue).

0 голосов
/ 09 мая 2020

Ответ зависит от содержания пока l oop. Если l oop запускает некоторый logi c, который работает полностью в рамках и под контролем основной программы, то закрытие приложения приведет к завершению всего.

Однако, если l oop вызывает некоторые внешние процедуры или функции операционной системы (пример: запись в файл, открытие сетевого соединения, выполнение команды, запуск пакетного задания и т. д. c), затем закрытие приложения не приведет к завершению всего.

0 голосов
/ 09 мая 2020

Все, что сказано ниже, - это детали реализации - ДЛЯ WINDOWS - и в основном недокументированное поведение. Не полагайтесь на какую-либо информацию.

В качестве детали реализации, эта задача, скорее всего, будет запланирована для выполнения в потоке пула потоков.

Если задача не была запущена к моменту запуска процесса выхода, не имеет значения, что она изначально была поставлена ​​в очередь.

Если задача в настоящее время выполняется, то согласно некоторым деталей реализации завершения процесса на Windows в конечном итоге будет выполняться только один поток, который не будет выполнять эту задачу. Таким образом, в этом случае он будет принудительно завершен.

Если задача уже завершила выполнение, будь то завершение или выдача исключения, то поток не занят ею. Однако, если исключение осталось незамеченным, то финализатор - если он получит возможность выполнить - выбросит это. Обратите внимание, что финализаторы также не гарантированно работают при любых обстоятельствах.

Эта страница должна была быть видна, но последняя ошибка Microsoft в лишении доступа к старому MSDN блоги продолжается.

Точно так же, если вам удастся отследить первую ссылку на этой странице, сделайте это и прочтите ее.

PS: Вот ссылка для блога Раймонда. Из обоих источников вы обнаружите, что только один поток продолжает завершение процесса.

...