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

标签 .net multithreading reference garbage-collection scope

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

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/

相关文章:

c# - 为什么在 QueryOver SingleOrDefault 中很慢?

multithreading - 使用 Entity Framework 的多线程子查询抛出错误

c# - 为什么 AsyncLocal<T> 传播到子线程而 ThreadLocal<T> 不传播?

C# 动态和 COM 对象

c# - 如何在 C# 中更改字符串路径的扩展名?

c# - System.IObserver'1<T0> 在未引用的程序集中定义。您必须添加对程序集的引用

c++ - 我应该在 C++ 的类中存储引用吗?

c# - 使用 async/await 时处理节流/速率限制(429 错误)

C# ConcurrentDictionary 与线程控制的 ManualResetEvent

c++ - Constexpr 类采用 const 引用未编译