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