Фоновый поток выполнил событие после выхода из основного потока? - PullRequest
0 голосов
/ 29 мая 2019

Я просматривал документы Microsoft для ThreadPool, и они объяснили, что потоки ThreadPool являются фоновыми потоками, которые не поддерживают работу приложения, если все потоки переднего плана завершены.

Вот фрагмент кода:

public static void Main()
{
    ThreadPool.QueueUserWorkItem(ThreadProc);
    Console.WriteLine("From main foreground thread");
    //Thread.Sleep(1000);

    Console.WriteLine("Exiting from main");
}

static void ThreadProc(object stateInfo) {
    Console.WriteLine("From the thread pool");
}

С Thread.Sleep(1000) без комментариев это гарантирует, что фоновый поток завершится до выхода из основного потока переднего плана.Но когда мы комментируем часть сна, я также получаю вывод вида:

From main foreground thread
Exiting from main
From the thread pool

Это означает, что фоновый поток все еще выполняется, даже когда основной поток переднего плана вышел.Почему так?

1 Ответ

0 голосов
/ 29 мая 2019

Конец метода Main не означает, что завершился поток «переднего плана». Даже если это так, это не значит, что ваш процесс завершен.

Обычно процесс останавливается, когда все потоки, которые выполняются в этом процессе (включая потоки из пула потоков, у которых работа в очереди), завершаются. Однако, если вы выходите из процесса, используя ExitProcess . CLR работает немного более сложным образом ( см. Здесь ), что делает некоторую очистку перед тем, как реально создать приложение.

В результате, до того, как все рабочие потоки будут уничтожены, наступает довольно много времени, когда работа может быть завершена.

...