Пользовательский интерфейс зависает, потому что вы блокируете поток пользовательского интерфейса с помощью mre.WaitOne();
. Если вам нужно дождаться завершения потока, вы можете использовать его свойство IsAlive и обрабатывать сообщения приложения, для этого вам не нужны события приложения:
while(_t.IsAlive)
Application.DoEvents();
Существует 2 отмены потокаaproaches:
- кооператив - код, выполняемый потоком, знает, что его можно отменить и обработать отменой изящно, вот что вы пытаетесь сделать здесь.
- обязательно - принудительно остановить поток - вызовите
Thread.Abort
или Interrupt
, , не используйте , что.
Как упоминалось @HansPassant, bool
- не лучший вариантпотому что этот компилятор может оптимизировать это, и значение bool может быть кэшировано, и его изменение не может быть обработано зацикливанием потока. Вам нужно сделать его по крайней мере volatile
или просто изменить код для использования CancellationSource
.
Учитывая, что делает ваш поток, возможно, BackgroundWorker
, Timer
или шаблон Производитель / Потребитель - лучшая альтернативана Thread
, но у меня слишком мало контекста, чтобы что-то рекомендовать. Также он работает хорошо только в том случае, если у вас есть только 1 экземпляр Form1
в приложении, если у вас есть мультиформное приложение, и пользователь может открыть несколько форм Form1
, у вас будут проблемы.
Общие рекомендации, еслиВы можете работать с полями уровня экземпляра, пожалуйста, не используйте static.