我正在查看遗留系统并查看以下代码。 ServiceLifetimeThread
方法在单独的线程上启动,然后在第二个try
块中创建新线程。
我的问题是创建的新线程会发生什么?一旦CheckDeviceStatus
执行完毕,它们会关闭吗?
private void ServiceLifetimeThread(WaitHandle pleaseStopEvent, object args)
{
while (!PleaseStopEvent)
{
try
{
//freeze the lifetime thread on configurable period of time
pleaseStopEvent.WaitOne(_serviceConfiguration.LifeTimeThreadWakeUpIntervalSeconds /*seconds*/ * 1000 /*milliseconds*/);
}
catch (Exception ex)
{
// Log it...
}
try
{
var deviceIds = GetDeviceIdsToCheckStatus();
foreach (var deviceId in deviceIds)
{
//each time start the new thread and send a command to it
new Thread(CheckDeviceStatus).Start(deviceId);
}
}
catch (Exception ex)
{
// Log it...
}
}
}
答案 0 :(得分:3)
我认为在这里对“线程”这个词进行区分非常重要。 这里有两种类型的“线程”(至少我们关注):
1:System.Threading.Thread - 一个对象。
2:CLR(托管)线程。
调用OBJECT
创建的new Thread()
一旦.Start()
完成调用就会有资格进行垃圾回收(例如,for循环继续到下一行),并且GC决定最好的时候被摧毁/清理(GC的操作对我来说似乎是一种黑暗的艺术!)
但是,.Start()
方法将创建一个新的CLR线程。这不受上面创建的对象的生命周期的影响,因此不会受到垃圾收集器对该对象的影响。
相反,只要方法“CheckDeviceStatus”完成,就会销毁此CLR线程。
这可以通过调用Thread.Abort和其他一些东西来改变,但是你的代码示例没有提到这些,也没有表明它们的使用,所以我没有进入这里。< / p>