Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

this.Invoke(onCompleted);

Ответ 6

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

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

Ответ 8

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

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

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