我一直在阅读多线程应用程序的代码和示例。有时我会看到这样的片段:
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");
}
}
它一直困扰着我:我应该将对(前台)线程的引用保留在某处吗?毕竟,它是 Go 方法中的局部变量。因此,一旦 Go 的执行完成,线程引用就应该被垃圾回收。那么也许,只是也许,线程在执行时会被GC?
如果是后台线程,答案会改变吗?
提前致谢!
最佳答案
线程是其生命周期不受垃圾收集器控制的对象的一个示例。在底层它是一个操作系统对象。只要线程正在运行代码,它就一直存在。 Thread 类只是它的包装。另一个例子是窗口,只要您的代码或用户不关闭它,它就处于事件状态。 Winforms 不要求您保存对 Form 类包装器的引用。而你通常不会:
Application.Run(new Form1());
是样板代码,您在任何地方都不持有对 Form1 类实例的引用。
您始终可以从现有正在运行的线程重新创建 Thread 对象。您可以使用 Thread.CurrentThread 来执行此操作。它不一定是您使用 Thread 构造函数创建的线程。它可以在线程池线程内使用。或者不是由托管代码启动的线程。程序的主线程就是一个很好的例子,它是由 Windows 启动的。
尽管如此,丢失对线程的引用并不是一个好的做法。这意味着您无法检查它是否仍在运行。这意味着当它应该停止时你却无法停止它。例如,当用户想要退出您的程序时。
关于.net - 我应该在线程启动后保留对线程的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6480207/