我有一点大脑冻结,所以我想我会把它扔到那里的集体天才......
我有一个事件被引发(这将在“加注者”的线程上)并且我消耗它。
但是,一旦我处理此事件,我需要触发另一个线程来执行事件所表示的工作负载。所以,我正在使用:
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()
执行的工作?
答案 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操作?是。 它会自动发生吗?线程完成后。
但是,如果这是一个非常长的过程,并不表示失败回到线程,它可能会无限期地锁定资源。
在这些情况下,回调机制可能是一个更好的解决方案,让线程在不确定的时间内保持打开状态。