捕获.Net线程结束事件
我想要一种优雅的方式来捕获线程结束/退出事件。到目前为止,我发现了两种方法:捕获.Net线程结束事件,.net,multithreading,.net,Multithreading,我想要一种优雅的方式来捕获线程结束/退出事件。到目前为止,我发现了两种方法: 使用具有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中的线程可能看起来像死线程,但实际上不是。这在许多其他原因(包括在您引用的页面中间的免责声明)中,使得不希望获得子线程的实际状态。