gpt4 book ai didi

.net - 我应该在线程启动后保留对线程的引用吗?

转载 作者:行者123 更新时间:2023-12-02 17:45:11 24 4
gpt4 key购买 nike

我一直在阅读多线程应用程序的代码和示例。有时我会看到这样的片段:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com