线程管理 - 一旦完成执行,线程是否会关闭?

时间:2015-08-04 14:50:47

标签: c# multithreading

我正在查看遗留系统并查看以下代码。 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...
        }
    }
}

1 个答案:

答案 0 :(得分:3)

我认为在这里对“线程”这个词进行区分非常重要。 这里有两种类型的“线程”(至少我们关注):

1:System.Threading.Thread - 一个对象。
2:CLR(托管)线程。

调用OBJECT创建的new Thread()一旦.Start()完成调用就会有资格进行垃圾回收(例如,for循环继续到下一行),并且GC决定最好的时候被摧毁/清理(GC的操作对我来说似乎是一种黑暗的艺术!)

但是,.Start()方法将创建一个新的CLR线程。这不受上面创建的对象的生命周期的影响,因此不会受到垃圾收集器对该对象的影响。 相反,只要方法“CheckDeviceStatus”完成,就会销毁此CLR线程。

这可以通过调用Thread.Abort和其他一些东西来改变,但是你的代码示例没有提到这些,也没有表明它们的使用,所以我没有进入这里。< / p>