после прочтения нескольких статей, я все еще не уверен, что понимаю многопоточность, чтобы решить мою проблему .Как ждать рабочей нити в основной форме?
У меня есть основная форма, которая запустит рабочий рабочий поток (рабочий). Рабочий поток выполнит цикл бесконечности While (! Stopping) и будет спать в конце каждого итерационного завершения глобальным объектом остановки (объект блокировки только для чтения). При правильной работе при нажатии кнопки «Стоп» рабочий стол остановится после текущей итерации.
Теперь, когда пользователь закрывает основную форму, он сначала устанавливает флаг «Стоп», чтобы рабочий поток завершил свое текущее задание. После этого основная форма закроется. Кажется достаточно простым, но я не мог заставить его работать.
Я попробовал либо worker.Join(), либо test woker.IsAlive в цикле while, но оба случая заблокируют приложение (основная форма) через несколько секунд по какой-то причине?
Ниже мой код в обработчик события Form_Closing (не работает):
// Tell the thread to stop the file
Stop();
Logger.Info("Stopping the thread by Close the application");
//Not working as well
//worker.Join();
while (worker.IsAlive)
{
Thread.Sleep(5000);
Logger.Info("After sleep for 5 seconds");
}
Logger.Info("worker thread stopped");
Одно интересное в том, что рабочий поток кажется, всегда пишет журнал событий до конца каждой итерации цикла, то остальные запись в журнале будет основным событием формы внутри цикла while (worker.IsAlive).
Спасибо, это решение работает хорошо. –