Вопрос по multithreading, c#, thread-state – Как проверить, закончил ли поток выполнение

31

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

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

Ваш Ответ

8   ответов
3

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

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

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

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

this.invoke(onCompleted);
@ Майк Да. Добавьте параметр в действие onCompleted и передайте параметр при его вызове. shanmuga raja
Можете ли вы передать идентификатор обратно в обратный вызов onCompleted ()? Mike
это круто. благодарю вас. Yohannes Tamru
это полный ответ. Спасибо Faeze Alahabadi
0

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

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

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

7

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

9

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

1

BackgroundWorker ClassсOnRunWorkerCompleted ты можешь это сделать.

Ответы только по ссылке являются плохими ответами, потому что если ссылка когда-либо изменится, ваш ответ становится бесполезным Пожалуйста, включите соответствующую информацию в ответ и объясните, почему то, что вы предлагаете, отвечает на вопрос. ChrisF
55

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

1

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

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

9

когда он закончится, и подписаться на него.

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

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

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

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

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

Зачем использовать это над Thread.IsAlive? Brian Webster
Перед вызовом Thread.Join () вы всегда должны проверить, что текущий поток отличается от того, к которому вы присоединяетесь. В противном случае вы никогда не вернетесь. Daniel Rose
@DanielRose Можете ли вы дать быстрый фрагмент о том, как проверить, отличаются ли они? Благодарю. Ryan R
@RyanR Предполагаяt1 Поток, к которому вы хотите присоединиться:if (Thread.CurrentThread != t1) t1.Join(); Daniel Rose
@ Даниэль - хорошая мысль. ChrisF

Похожие вопросы