Как проверить, закончил ли поток выполнение - PullRequest
32 голосов
/ 05 мая 2010

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

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

Ответы [ 8 ]

57 голосов
/ 05 мая 2010

Используйте флаг Thread.IsAlive. Это должно придать статус потока.

10 голосов
/ 05 мая 2010

Для потока у вас есть свойство myThread.IsAlive. Значение false, если метод потока возвращен или поток был прерван.

10 голосов
/ 05 мая 2010

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

В качестве альтернативы вы можете позвонить Thread.Join() без аргументов:

Блокирует вызывающий поток до тех пор, пока поток не прекратит работу, продолжая при этом выполнять стандартную перекачку COM и SendMessage.

Thread.Join(1) будет:

Блокирует вызывающий поток до тех пор, пока поток не завершится или не истечет указанное время, продолжая при этом выполнять стандартную откачку COM и SendMessage.

В этом случае указанное время составляет 1 миллисекунду.

7 голосов
/ 05 мая 2010

Использовать Thread.Join(TimeSpan.Zero) Он не будет блокировать вызывающего и возвращает значение, указывающее, завершил ли поток свою работу. Кстати, это стандартный способ тестирования всех классов WaitHandle.

3 голосов
/ 24 марта 2017

Если вы не хотите блокировать текущий поток, ожидая / проверяя завершение другого запущенного потока, вы можете реализовать метод обратного вызова, как это.

Action onCompleted = () => 
{  
    //On complete action
};

var thread = new Thread(
  () =>
  {
    try
    {
      // Do your work
    }
    finally
    {
      onCompleted();
    }
  });
thread.Start();

Если вы имеете дело с элементами управления, которые не поддерживают работу с несколькими потоками, вам необходимо вызвать метод обратного вызова

this.invoke(onCompleted);
1 голос
/ 30 марта 2013

Взгляните на BackgroundWorker Class , с OnRunWorkerCompleted вы можете сделать это.

1 голос
/ 24 августа 2012

Я широко использую IsAlive, если только я не хочу блокировать текущее выполнение (вызывающего потока), и в этом случае я просто вызываю Join () без параметра. Теперь имейте в виду, что IsAlive может вернуть false, если целевой поток еще не начал выполнение по какой-либо причине.

Карлос Мериге.

0 голосов
/ 05 мая 2010

Это зависит от того, как вы хотите его использовать. Использование Join является одним из способов. Другой способ сделать это - позволить потоку уведомить вызывающую сторону потока, используя событие. Например, если у вас есть поток графического интерфейса пользователя (GUI), который вызывает процесс, который выполняется некоторое время и должен обновить GUI после его завершения, вы можете использовать это событие для этого. Этот сайт дает вам представление о том, как работать с событиями:

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

Помните, что это приведет к многопоточным операциям, и в случае, если вы хотите обновить графический интерфейс из другого потока, вам придется использовать Invoke метод элемента управления, который вы хотите обновить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...