Как проверить, закончил ли поток выполнение
У меня следующая проблема:
Я хочу проверить (C#), завершил ли поток выполнение, то есть, вернулся ли метод потока. То, что я делаю сейчас, это вызов Thread.Join(1)
, но это дает задержку в 1 мс. Есть ли способ просто проверить, закончил ли поток. инспектирование Thread.ThreadState
просто кажется слишком громоздким.
8 ответов
Использовать Thread.IsAlive
флаг. Это должно дать статус потока.
Для потока у вас есть myThread.IsAlive
имущество. Значение false, если метод потока возвращен или поток был прерван.
Если вы не хотите блокировать текущий поток, ожидая / проверяя завершение другого запущенного потока, вы можете реализовать метод обратного вызова следующим образом.
Action onCompleted = () =>
{
//On complete action
};
var thread = new Thread(
() =>
{
try
{
// Do your work
}
finally
{
onCompleted();
}
});
thread.Start();
Если вы имеете дело с элементами управления, которые не поддерживают работу с несколькими потоками, то вам нужно вызвать метод обратного вызова.
this.invoke(onCompleted);
Вы можете запустить событие из вашего потока, когда он закончится, и подписаться на него.
Или вы можете позвонить Thread.Join()
без каких-либо аргументов:
Блокирует вызывающий поток до тех пор, пока поток не завершится, продолжая при этом выполнять стандартную прокачку COM и SendMessage.
Thread.Join(1)
будут:
Блокирует вызывающий поток до тех пор, пока поток не завершится или не истечет указанное время, продолжая при этом выполнять стандартную прокачку COM и SendMessage.
В этом случае указанное время составляет 1 миллисекунду.
Использование Thread.Join(TimeSpan.Zero)
Он не будет блокировать вызывающую функцию и возвращает значение, указывающее, завершил ли поток свою работу. Кстати, это стандартный способ тестирования всех WaitHandle
классы также.
Я широко использую IsAlive, если только я не хочу блокировать текущее выполнение (вызывающего потока), в этом случае я просто вызываю Join() без параметра. Теперь имейте в виду, что IsAlive может возвращать false, если целевой поток еще не начал выполнение по какой-либо причине.
Карлос Мериге.
Взгляните на класс BackgroundWorker, с OnRunWorkerCompleted вы можете это сделать.
Это зависит от того, как вы хотите его использовать. Использование Join является одним из способов. Другой способ сделать это - позволить потоку уведомить вызывающую сторону потока, используя событие. Например, если у вас есть поток графического пользовательского интерфейса (GUI), который вызывает процесс, который выполняется некоторое время и должен обновить GUI, когда он завершится, вы можете использовать это событие для этого. Этот сайт дает вам представление о том, как работать с событиями:
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
Помните, что это приведет к многопоточным операциям, и в случае, если вы хотите обновить графический интерфейс из другого потока, вам придется использовать Invoke
метод контроля, который вы хотите обновить.