【问题标题】:Capture .Net Thread End Event捕获 .Net 线程结束事件
【发布时间】:2009-05-21 16:10:25
【问题描述】:

我想要一种优雅的方式来捕获线程结束/退出事件。到目前为止,我发现了两种方法:

  1. 使用具有 RunWorkerCompleted 事件的后台工作程序,或者,
  2. 让我的线程工作者明确调用“我正在退出”委托。

是的,这些都会起作用,但必须有某种方法从父线程(调用 Thread.Start() 方法的线程)中检测到线程何时退出,无论为什么、如何或何时退出。例如,当线程退出时,Visual Studio 调试输出窗口会报告 :, "线程 0x1454 以代码 0 (0x0) 退出。"所以应该是可以的。

提前感谢您的任何想法!

【问题讨论】:

    标签: .net multithreading


    【解决方案1】:

    如果您引用了 Windows 窗体,则有 Application.ThreadExit 事件。

    就个人而言,我通常将我的线程处理包装到我自己的类中(出于多种原因,主要是为了使创建和启动具有许多参数的线程变得更加简洁)——这使得添加 Complete 事件变得微不足道。只需让线程的运行代码调用您的线程工作委托,然后引发完整事件。

    【讨论】:

      【解决方案2】:

      您可以从父线程轮询ThreadStateIsAlive 属性

      【讨论】:

      • 这样做的问题是,如果 ThreadState 正在等待执行特定指令,它会显示 WaitSleepJoin。因此,WaitSleepJoin 中的线程可能看起来像死线程,但实际上并非如此。除了许多其他原因(包括您引用的页面中间的免责声明)之外,这使得它不适合获取子线程的实际状态。
      【解决方案3】:

      您可以使用 thread.join() 这是一个阻塞命令,但会继续执行 com 和 sendMessage。

      Thread t = new Thread (delegate() { Console.ReadLine(); });
      
      t.Start();
      
      t.Join();    // Wait until thread t finishes
      
      Console.WriteLine ("Thread t's ReadLine complete!");
      

      【讨论】:

        【解决方案4】:

        如果有人在谷歌上搜索:

        我会以稍微修改的方式使用选项 2。使用 ManualResetEvent(或 AutoResetEvent)并让父线程等待您的线程使用 WaitOne 方法退出。

        using(ManualResetEvent completed = new ManualResetEvent(false))
        {
        
        var thread = new Thread(new ThreadStart(delegate()
        {
            try
            {
                // do work here
            }
            finally
            {
                completed.Set();
            }
        
        }));
        
        // start thread
        thread.Start();
        
        
        // wait until thread is completed
        completed.WaitOne();
        }
        

        您也可以使用 AndrewB 建议的 Thread.Join(),但我更喜欢 ManualResetEvent,因为它可以让您更好地控制调用方式和时间。

        【讨论】:

          猜你喜欢
          • 2013-02-03
          • 1970-01-01
          • 1970-01-01
          • 2014-09-10
          • 2023-03-20
          • 1970-01-01
          • 2011-07-11
          • 1970-01-01
          • 2010-09-05
          相关资源
          最近更新 更多