我想要一种优雅的方式来捕获线程结束/退出事件。到目前为止,我找到了两种方法:
是的,这些都可行,但是必须有一些来自父线程(调用Thread.Start()方法的线程)的方法来检测线程何时退出而不管原因,方式或时间。例如,Visual Studio Debug Output窗口报告线程何时退出 :,“线程0x1454已退出,代码为0(0x0)。”所以一定是可能的。
提前感谢任何想法!
答案 0 :(得分:3)
如果您有对Windows窗体的引用,则会出现Application.ThreadExit事件。
就个人而言,我通常将我的线程处理包装到我自己的类中(出于很多原因,主要是为了使创建和启动具有许多参数的线程变得更加清晰) - 这使得完成事件变得微不足道。只需让线程的运行代码调用你的线程工作委托,然后引发完整的事件。
答案 1 :(得分:1)
答案 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
,因为它可以让您更好地控制调用它的方式和时间。