启动新线程 - 我需要关心垃圾回收吗?

8

我有点脑抽,所以想向 SO 的集体智慧寻求帮助...

我有一个事件被触发了(这将在“触发者”的线程上),而我需要消费它。

然而,一旦我处理这个事件,我需要启动另一个线程来执行该事件所表示的工作负载。因此,我正在使用:

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()中正在执行的工作?


1
也许我的答案在这里?https://dev59.com/uHVD5IYBdhLWcg3wHnyd - user11937
请查看此答案 - ribram
1
这个问题的答案是什么?https://dev59.com/u0jSa4cB1Zd3GeqPCyJo - user11937
1
是的,那就是答案。一个线程在它的工作完成之前不会被垃圾回收。 - Centro
3个回答

8

没有必要跟踪Thread变量,当t超出范围时,GC不会终止线程。

我不知道“很长时间”是多久,但您最好使用类似ThreadPool.QueueUserWorkItem的东西。也就是说:

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

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

我喜欢这个答案 - 它是最具决定性的。 - user11937

1

如果我理解正确,您担心线程在仍在工作时可能被垃圾回收。这会发生是因为方法退出后没有对t的引用。

但是您不必担心。只要线程正在运行,就会有对它的引用,线程不会被垃圾回收。


0

线程和对象可以被垃圾回收吗?可以。 会自动发生吗?一旦线程完成。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接