启动新线程 - 我是否需要关心垃圾收集

时间:2011-06-07 16:46:59

标签: c# .net multithreading garbage-collection

我有一点大脑冻结,所以我想我会把它扔到那里的集体天才......

我有一个事件被引发(这将在“加注者”的线程上)并且我消耗它。

但是,一旦我处理此事件,我需要触发另一个线程来执行事件所表示的工作负载。所以,我正在使用:

private void MyEventHandler(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(MyHandler));
    t.Start();
}

private void MyHandler()
{
    DoStuff(); // takes a long time
}

我的问题是:我是否需要关注变量t的生命周期?即可以t垃圾收集,从而中止正在DoStuff()执行的工作?

3 个答案:

答案 0 :(得分:8)

没有特别的原因需要跟踪Thread变量。当t超出范围时,GC不会终止该线程。

我不知道“很长一段时间”有多久,但你可能最好使用像ThreadPool.QueueUserWorkItem这样的东西。那就是:

private void MyEventHandler(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(MyHandler);
}

private void MyHandler(object state)
{
    DoStuff();
}

答案 1 :(得分:1)

如果我理解正确的话,你可能会认为线程在垃圾收集时仍然可以收集垃圾。这会发生,因为在退出方法之后没有对t的引用。

但你不必害怕。只要线程正在运行,就会有对它的引用,并且线程不会被垃圾收集。

答案 2 :(得分:0)

线程是否可以运行并且对象可以进行GC操作?是。 它会自动发生吗?线程完成后。

但是,如果这是一个非常长的过程,并不表示失败回到线程,它可能会无限期地锁定资源。

在这些情况下,回调机制可能是一个更好的解决方案,让线程在不确定的时间内保持打开状态。