gpt4 book ai didi

c# - .Net Garbage 会收集一个未被引用但有一个正在工作的线程的对象吗?

转载 作者:太空狗 更新时间:2023-10-29 20:52:30 25 4
gpt4 key购买 nike

我有以下代码(为了便于阅读而删减):

主类:

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 被垃圾回收。

Apparently this isn't the case .

我现在想知道无论这个线程是否“忙”,垃圾回收是否都会发生。换句话说,它是否有可能在 5 秒超时到期之前被垃圾收集?

换句话说,垃圾收集器是否有可能在我的 Thinker 完成处理之前收集它?

最佳答案

不,只要一个线程被引用,它就被认为是活跃的,并且任何正在运行的线程都被认为是被引用的(IIRC,一个正在运行的线程将其堆栈注册为 GC 根,并且该堆栈将引用该线程)。

那是说我正在查看您的示例,但我不明白您认为线程是在哪里生成的?

关于c# - .Net Garbage 会收集一个未被引用但有一个正在工作的线程的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036403/

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