C# 旋转一个新线程-我需要关心垃圾收集吗
我的大脑有点僵硬,所以我想我应该把这个扔给集体天才,所以 我有一个被引发的事件(这将出现在“raiser”的线程上),我使用它 然而,一旦我处理了这个事件,我就需要启动另一个线程来执行该事件所表示的工作负载。因此,我使用:C# 旋转一个新线程-我需要关心垃圾收集吗,c#,.net,multithreading,garbage-collection,C#,.net,Multithreading,Garbage Collection,我的大脑有点僵硬,所以我想我应该把这个扔给集体天才,所以 我有一个被引发的事件(这将出现在“raiser”的线程上),我使用它 然而,一旦我处理了这个事件,我就需要启动另一个线程来执行该事件所表示的工作负载。因此,我使用: private void MyEventHandler(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(MyHandler)); t.Start(); } private
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
的生命周期?i、 e.t
是否可以被垃圾收集,从而中止在DoStuff()
中执行的工作?没有特别的原因需要跟踪线程变量。当t
超出范围时,GC不会终止线程
我不知道“很长一段时间”有多长,但是你最好使用类似的东西。即:
private void MyEventHandler(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(MyHandler);
}
private void MyHandler(object state)
{
DoStuff();
}
线程和对象是否可以GCed?对 它会自动发生吗?一旦线程完成 但是,如果这是一个非常长的进程,并且没有向线程返回故障,那么它可能会无限期地锁定资源
在这些情况下,回调机制可能是一个更好的解决方案,可以让线程在一段不确定的时间内保持打开状态。如果我理解正确,您可能会担心线程在工作时可能会被垃圾收集。这会发生,因为在方法退出之后,没有对t的引用
但是你不必害怕。只要线程正在运行,就会有一个对它的引用,线程不会被垃圾收集。也许我的答案在这里?看到这个和这个的答案了吗?是的,这就是答案。线程在其工作完成之前不会被垃圾收集。我喜欢这个答案——它是最有说服力的。