Почему Main ждет, когда крутится новая нить, но не так с задачей - PullRequest
0 голосов
/ 03 июля 2018

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

, например

static void Main(string[] args) 
{
    Thread t = new Thread(new ThreadStart(SomeMethod));
    t.Start();            
    // Main will wait, and app won't close until SomeMethod finishes
}

против.

static void Main(string[] args)
{
    Task.Run(() => SomeMethod());
    // Main will close / app shuts down without waiting for SomeMethod to finish
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

При чтении документации для свойства Thread.IsBackground вы заметите, что существует два типа потоков: фон и передний план:

... фоновые потоки не препятствуют завершению процесса. Как только все потоки переднего плана, принадлежащие процессу, завершаются ... все оставшиеся фоновые потоки останавливаются и не завершаются.

Причина, по которой конструктор Thread предотвращает завершение процесса Main, заключается в том, что по умолчанию он создает потоки переднего плана, тогда как асинхронные операции на основе задач автоматически выполняются в ThreadPool, который по умолчанию использует фоновые потоки, и позволит завершить процесс до его завершения.

0 голосов
/ 03 июля 2018

Вы установили SomeMethod для запуска в другом потоке, поэтому теперь он асинхронный. Вы не ждете результата, поэтому Main просто продолжит работу и просто выйдет, уничтожив оба потока в процессе.

Использование:

Task.Run(async () => await SomeMethod());

Если предположить, что SomeMethod является ожидаемым, в противном случае вы можете просто дождаться внешнего результата

Task.Run(() => SomeMethod()).Result;
...