44

我有以下问题:

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

4

8 回答 8

73

使用Thread.IsAlive旗帜。这是为了给线程状态。

于 2010-05-05T14:43:46.217 回答
15

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

于 2010-05-05T13:19:00.353 回答
13

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

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

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

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

this.Invoke(onCompleted);
于 2017-03-23T23:19:01.647 回答
11

当它完成并订阅它时,您可以从您的线程中触发一个事件。

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

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

Thread.Join(1)将要:

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

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

于 2010-05-05T13:18:14.393 回答
9

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

于 2010-05-05T13:25:26.550 回答
2

我广泛使用 IsAlive,除非我想阻止(调用线程的)当前执行,在这种情况下,我只调用 Join() 而不带参数。现在,请注意,如果目标线程由于任何原因尚未真正开始执行,IsAlive 可能会返回 false。

卡洛斯·梅里赫。

于 2012-08-23T22:06:25.480 回答
1

看看BackgroundWorker Class,使用OnRunWorkerCompleted你可以做到。

于 2013-03-30T10:46:46.920 回答
0

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

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

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

于 2010-05-05T13:23:47.447 回答