捕获.Net线程结束事件

捕获.Net线程结束事件,.net,multithreading,.net,Multithreading,我想要一种优雅的方式来捕获线程结束/退出事件。到目前为止,我发现了两种方法: 使用具有RunWorkerCompleted事件的后台工作程序,或 让我的线程工作者显式地调用“我正在退出”委托 是的,这些方法会起作用,但是父线程(调用thread.Start()方法的线程)必须有某种方法来检测线程何时退出,而不管退出的原因、方式或时间。例如,VisualStudio调试输出窗口在线程退出时报告 :,“线程0x1454已退出,代码为0(0x0)。”因此这一定是可能的 提前感谢您的任何想法 您可以从父

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

  • 使用具有RunWorkerCompleted事件的后台工作程序,或
  • 让我的线程工作者显式地调用“我正在退出”委托
  • 是的,这些方法会起作用,但是父线程(调用thread.Start()方法的线程)必须有某种方法来检测线程何时退出,而不管退出的原因、方式或时间。例如,VisualStudio调试输出窗口在线程退出时报告 :,“线程0x1454已退出,代码为0(0x0)。”因此这一定是可能的


    提前感谢您的任何想法

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

    如果您有对Windows窗体的引用,则会发生事件

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

    您可以使用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!");
    

    如果有人在谷歌上搜索:

    我将以稍微修改的方式使用选项2。使用(或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
    ,因为它可以让您更好地控制调用的方式和时间。

    这样做的问题是,如果ThreadState正在等待特定指令执行,它将显示WaitSleepJoin。因此,WaitSleepJoin中的线程可能看起来像死线程,但实际上不是。这在许多其他原因(包括在您引用的页面中间的免责声明)中,使得不希望获得子线程的实际状态。