如何检查Thread是否完成执行

时间:2010-05-05 13:15:18

标签: c# multithreading thread-state

我有以下问题:

我想检查(C#)线程是否已完成执行,即线程方法是否已返回。我现在所做的是调用Thread.Join(1),但这会产生1毫秒的延迟。有没有办法简单地检查线程是否已完成。检查Thread.ThreadState似乎太麻烦了。

8 个答案:

答案 0 :(得分:57)

使用Thread.IsAlive标志。这是为了给出线程状态。

答案 1 :(得分:10)

您可以在完成并订阅该事件时从您的线程中触发事件。

或者你可以不带任何参数调用Thread.Join()

  

阻塞调用线程,直到线程终止,同时继续执行标准COM和SendMessage抽取。

Thread.Join(1)会:

  

阻塞调用线程,直到线程终止或指定的时间过去,同时继续执行标准COM和SendMessage抽取。

在这种情况下,指定的时间是1毫秒。

答案 2 :(得分:10)

对于线程,您拥有myThread.IsAlive属性。如果返回线程方法或线程被中止,则为false。

答案 3 :(得分:7)

使用Thread.Join(TimeSpan.Zero)它不会阻止调用者并返回一个值,指示该线程是否已完成其工作。顺便说一下,这也是测试所有WaitHandle类的标准方法。

答案 4 :(得分:3)

如果您不想通过等待/检查其他正在运行的线程完成来阻止当前线程,您可以 实现这样的回调方法。

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

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

如果您正在处理不支持跨线程操作的控件,那么您必须调用回调方法

this.invoke(onCompleted);

答案 5 :(得分:1)

我广泛使用IsAlive,除非我想阻止(调用线程的)当前执行,在这种情况下我只是在没有参数的情况下调用Join()。现在,请注意,如果目标线程由于某种原因尚未实际开始执行,则IsAlive可能会返回false。

Carlos Merighe。

答案 6 :(得分:1)

答案 7 :(得分:0)

这取决于您想要如何使用它。使用Join是一种方法。另一种方法是让线程通过使用事件通知调用者线程。例如,当您的图形用户界面(GUI)线程调用运行一段时间并且需要在完成时更新GUI的进程时,您可以使用该事件来执行此操作。本网站为您提供有关如何处理活动的想法:

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

请记住,它会导致跨线程操作,如果您想从另一个线程更新GUI,则必须使用要更新的控件的Invoke方法。