一旦线程启动,我应该保持对线程的引用吗?

Ron*_*ein 6 .net multithreading garbage-collection scope reference

我一直在阅读多线程应用程序的代码和示例.我不时会看到一个代码片段:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started");
        Go();
        Console.WriteLine("press [ENTER] to quit");
        Console.ReadLine();
    }

    private static void Go()
    {
        var thread = new Thread(DoSomething);
        thread.Start();
    }

    private static void DoSomething()
    {
        Console.WriteLine("doing something");
    }
}
Run Code Online (Sandbox Code Playgroud)

它一直困扰着我:我应该在某处保留对(前台)线程的引用吗?毕竟,它是Go方法内的局部变量.因此,一旦执行Go完成,线程引用应该被垃圾收集.也许,也许,也许,线程将在执行时进行GC操作?

如果它是后台线程,答案会改变吗?

提前致谢!

Han*_*ant 4

线程是一种生命周期不受垃圾收集器控制的对象的示例。在底层它是一个操作系统对象。只要线程正在运行代码,它就一直存在。Thread 类只是它的包装。另一个例子是窗口,只要您的代码或用户不关闭它,它就处于活动状态。Winforms 不要求您保存对 Form 类包装器的引用。而你通常不会:

 Application.Run(new Form1());
Run Code Online (Sandbox Code Playgroud)

是样板代码,您在任何地方都不持有对 Form1 类实例的引用。

您始终可以从现有正在运行的线程重新创建 Thread 对象。您可以使用 Thread.CurrentThread 来执行此操作。它不一定是您使用 Thread 构造函数创建的线程。它可以在线程池线程内使用。或者不是由托管代码启动的线程。程序的主线程就是一个很好的例子,它是由 Windows 启动的。

然而,丢失对线程的引用并不是一个好的做法。这意味着您无法检查它是否仍在运行。这意味着当它应该停止时你却无法停止它。例如,当用户想要退出您的程序时。