捕获.Net线程结束事件

时间:2009-05-21 16:10:26

标签: .net multithreading

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

  1. 使用具有RunWorkerCompleted事件的后台工作程序,或
  2. 让我的线程工作者明确调用“我正在退出”代理。
  3. 是的,这些都可行,但是必须有一些来自父线程(调用Thread.Start()方法的线程)的方法来检测线程何时退出而不管原因,方式或时间。例如,Visual Studio Debug Output窗口报告线程何时退出 :,“线程0x1454已退出,代码为0(0x0)。”所以一定是可能的。

    提前感谢任何想法!

4 个答案:

答案 0 :(得分:3)

如果您有对Windows窗体的引用,则会出现Application.ThreadExit事件。

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

答案 1 :(得分:1)

您可以从父线程

中轮询ThreadStateIsAlive属性

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果有人在谷歌搜索:

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