Как проверить, завершено ли выполнение потока

у меня следующая проблема:

Я хочу проверить (c#), закончил ли поток выполнение, т. е. если метод потока вернулся. То, что я делаю сейчас-это вызов Thread.Join(1), но это дает задержку в 1 мс. Есть ли способ просто проверить, закончил ли поток. Осмотр Thread.ThreadState просто кажется слишком громоздким.

8 ответов


почему Thread.IsAlive флаг. Это должно дать статус потока.


вы можете запустить событие из своего потока, когда оно закончится, и подписаться на него.

в качестве альтернативы вы можете позвонить 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 метод управления, который вы хотите обновить.