ThreadPool темы являются фоновыми темами (см. Ссылку). Они не будут поддерживать работу вашего приложения при выходе из основного потока.
Как правило, в приложениях WinForms это не является проблемой, поскольку основной поток пользовательского интерфейса вызывает Application.Run и запускает обработку событий. Для вашего консольного приложения, если ваш метод Main не ожидает какого-либо завершения рабочего элемента, основной поток поставит его в очередь и завершит работу.
Вы можете создать фоновый поток самостоятельно и установить для его свойства IsBackground значение false. Или вы можете создать поток и вызвать Thread.Join , чтобы дождаться его завершения.
- РЕДАКТИРОВАТЬ -
Как предлагается в комментариях ниже, вы также можете использовать ManualResetEvent или даже пользовательский класс синхронизации, предложенный Linik. Цель состоит в том, чтобы заблокировать основной поток до завершения фоновых потоков.
Чтобы использовать ManualResetEvent, создайте его в своем основном потоке и передайте в качестве аргумента. (Я назначу это статической переменной здесь только для краткости.)
ManualResetEvent s_WaitEvent;
ManualResetEvent s_WaitEvent = new ManualResetEvent(false); // non-signaled
// queue work item here
s_WaitEvent.WaitOne();
В конце вашего рабочего потока, сообщите событие:
s_WaitEvent.Set();
Ссылка CountDownLatch хороша, если у вас есть много потоков, которые должны быть обработаны, прежде чем вы сможете выйти. Вы также можете использовать отдельные ManualResetEvents для каждого потока и дождаться их завершения, используя WaitHandle.WaitAll (WaitHandle []) . (ManualResetEvent наследуется от WaitHandle.)