2009-05-21 84 views
3

我想要一个优雅的方式来捕获线程结束/退出事件。我发现两种方法至今:捕获.Net线程结束事件

  1. 使用后台工作,其中有一个RunWorkerCompleted事件,或者,
  2. 有我的线程工作人员明确地叫:“我退出”代表。

是的,这些都可以工作,但是父线程(调用Thread.Start()方法的线程)必须有某种方式来检测线程何时退出,而不管原因,方式或时间。例如,Visual Studio调试输出窗口报告线程退出 时:“线程0x1454已退出,代码为0(0x0)”。所以它一定是可能的。

在此先感谢您的任何想法!

回答

1

如果你有Windows窗体的引用,还有的Application.ThreadExit事件中,你可以查询从父线程

+0

这样做的问题是,如果ThreadState正在等待特定指令执行,它将显示WaitSleepJoin。因此,WaitSleepJoin中的线程实际上可能看起来像一个死线程。这在许多其他原因(包括您参考的页面中间的免责声明)中,使得它不适合获取子线程的实际状态。 – 2009-05-21 16:16:44

3

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

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!"); 
0

如果有人使用Google为此:

我会略加修改的方式使用选项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(); 
} 

您还可以使用的Thread.join(),它AndrewB建议,但我更喜欢ManualResetEvent,因为它让你在它被称为如何以及何时进行更多控制。