Will .Net Garbage Collect an object that#39;s not referenced, but has a thread that#39;s doing work?(.Net Garbage 是否会收集未引用但具有正在工作的线程的对象?)
问题描述
我有以下代码(为了便于阅读而删减):
I have the following code (cut down for readability):
主类:
public StartProcess()
{
Thinker th = new Thinker();
th.DoneThinking += new Thinker.ProcessingFinished(ThinkerFinished);
th.StartThinking();
}
void ThinkerFinished()
{
Console.WriteLine("Thinker finished");
}
思考者班:
public class Thinker
{
private System.Timers.Timer t;
public delegate void ProcessingFinished();
public event ProcessingFinished DoneThinking;
BackgroundWorker backgroundThread;
public Thinker() { }
public StartThinking()
{
t = new System.Timers.Timer(5000); // 5 second timer
t.AutoReset = false;
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Start();
// start a background thread to do the thinking
backgroundThread = new BackgroundWorker();
backgroundThread.DoWork += new DoWorkEventHandler(BgThread_DoWork);
backgroundThread.RunWorkerAsync();
}
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DoneThinking();
}
BgThread_DoWork(object sender, DoWorkEventArgs e)
{
// work in here should go for much less than 5 seconds
// it will die if it doesn't
t.Stop();
DoneThinking();
}
}
我最初预计会发生的是,主类中的事件处理程序会阻止 Thinker 被垃圾收集.
What I originally expected to happen was that the event handler in the main class would prevent the Thinker from being garbage collected.
显然不是这样.
我现在想知道不管这个线程是否忙",是否会进行垃圾收集.换句话说,是否有可能在 5 秒超时到期之前被垃圾回收?
I'm now wondering whether garbage collection will occur regardless of whether this thread is "busy" or not. In other words, is there a chance it will be garbage collected before the 5 second timeout has expired?
换句话说,垃圾收集器是否有可能在我的思想者完成处理之前收集它?
To put it another way, is it possible for the garbage collector to collect my Thinker before it's finished processing?
推荐答案
不,一个线程只要被引用就被认为是活跃的,并且任何正在运行的线程都被认为是被引用的(IIRC一个正在运行的线程注册它的堆栈作为 GC 根,该堆栈将引用该线程).
No, a thread is considered live as long as it is referenced, and any thread that is running is considered to be referenced (IIRC a running thread registers its stack as a GC root, and that stack will reference the thread).
也就是说我正在查看您的示例,但我不明白您认为线程是在哪里产生的?
That said i'm looking at your example and i don't understand where you believe a thread is being spawned?
这篇关于.Net Garbage 是否会收集未引用但具有正在工作的线程的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:.Net Garbage 是否会收集未引用但具有正在工作的线程的对象?
基础教程推荐
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- rabbitmq 的 REST API 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01