【问题标题】:How to check if Thread finished execution如何检查线程是否完成执行
【发布时间】:2011-02-15 22:32:31
【问题描述】:

我有以下问题:

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

【问题讨论】:

    标签: c# multithreading thread-state


    【解决方案1】:

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

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

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

    this.Invoke(onCompleted);
    

    【讨论】:

    • 你能把 id 传回 onCompleted() 回调吗?
    • @Mike 是的。在 onCompleted 操作中添加参数,并在调用时传递参数。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        看看BackgroundWorker Class,用OnRunWorkerCompleted就可以了。

        【讨论】:

        • 仅链接的答案是不好的答案,因为如果链接发生变化,您的答案将变得毫无用处。请在答案中包含相关信息,并解释为什么您的建议可以回答问题。
        【解决方案5】:

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

        卡洛斯·梅里赫。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              您可以在线程完成后触发一个事件并订阅它。

              您也可以不带任何参数地调用Thread.Join()

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

              Thread.Join(1) 将:

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

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

              【讨论】:

              • 在调用 Thread.Join() 之前,您应该始终检查当前线程是否与您正在加入的线程不同。否则你永远不会回来。
              • @DanielRose 你能快速介绍一下如何检查它们是否不同吗?谢谢。
              • @RyanR 假设 t1 是您要加入的线程:if (Thread.CurrentThread != t1) t1.Join();
              猜你喜欢
              • 2022-01-02
              • 1970-01-01
              • 2017-05-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-16
              • 2016-06-23
              • 2010-12-09
              相关资源
              最近更新 更多