У меня есть следующая проблема:
Я хочу проверить (C#), если поток закончил выполнение, т.е. если метод потока возвратился. Что я делаю теперь вызов Thread.Join(1)
, но это дает задержку на 1 мс. Есть ли любой способ просто проверить, закончился ли поток. Осмотр Thread.ThreadState
просто кажется слишком громоздким.
Используйте флаг Thread.IsAlive
. Это должно дать статус потока.
Это зависит от того, как вы хотите его использовать. Использование соединения - это один из способов. Другой способ сделать это - позволить потоку уведомить вызывающего потока с помощью события.Например, если у вас есть поток графического пользовательского интерфейса (GUI), который вызывает процесс, который выполняется в течение некоторого времени и которому необходимо обновить графический интерфейс после его завершения, вы можете использовать событие для этого. Этот веб-сайт дает вам представление о том, как работать с событиями:
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
Помните, что это приведет к многопоточность операций, и в случае, если вы хотите обновить графический интерфейс из другого потока, вам придется использовать метод Invoke
элемента управления, который вы хотите обновить.
Используйте Thread.Join(TimeSpan.Zero)
Он не будет блокировать вызывающую сторону и вернет значение, показывающее, завершил ли поток свою работу. Кстати, это стандартный способ тестирования всех классов WaitHandle
.
Вы можете вызвать событие из вашего потока, когда он завершается, и подписаться на него.
В качестве альтернативы вы можете вызвать Thread.Join()
без аргументов:
Блокирует вызывающий поток до завершения потока, продолжая выполнять стандартные COM и SendMessage подкачки.
Thread.Join(1)
будет:
Блокирует вызывающий поток до завершения потока или истечения указанного времени, продолжая выполнять стандартные COM и SendMessage подкачки.
В данном случае указанное время равно 1 миллисекунде.
Для потока есть свойство myThread.IsAlive
. Оно равно false, если метод потока вернулся или поток был прерван.