.Net Garbage 是否会收集未引用但具有正在工作的线程的对象? [英] Will .Net Garbage Collect an object that's not referenced, but has a thread that's doing work?

查看:9
本文介绍了.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 是否会收集未引用但具有正在工作的线程的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆