1

我创建了这个测试程序,以了解当计时器回调线程返回但新创建的线程仍在运行时会发生什么。我将在下面看到 10 次“In Work”,即使当 timer_Elapsed 返回时本地线程变量不应再在范围内。将线程的“IsBackground”属性设置为 true 无效。

发生这种情况是因为 GC 还没有运行吗?因此假设以这种方式创建的线程将完成是否危险,因为 GC 可能随时运行并清理线程?

我知道这是一个愚蠢的例子,但我最感兴趣的是了解这里发生了什么,所以我知道要避免什么。谢谢!

public class Program
{
    static void Main(string[] args)
    {
        var timer = new Timer(500);
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.AutoReset = false;
        timer.Start();
        Console.ReadLine();
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("In timer elapsed.  Kicking off a thread in new local thread and then immediately exiting.");
        var thread = new Thread(Work);
        thread.Start(); // but...this doesn't stop when the current thread exits!  
        Console.WriteLine("About to exit timer elapsed.");
    }

    static void Work()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("In Work");
            Thread.Sleep(1000);
        }
    }
}
4

2 回答 2

3

正在执行的线程持有对自身的引用。GC 永远不会终止在其他地方超出范围的线程。

于 2012-05-23T16:12:09.960 回答
2

MSDN说一旦线程启动,就不需要保留对 Thread 对象的引用。

于 2012-05-23T16:14:52.423 回答