Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 旋转一个新线程-我需要关心垃圾收集吗_C#_.net_Multithreading_Garbage Collection - Fatal编程技术网

C# 旋转一个新线程-我需要关心垃圾收集吗

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

我的大脑有点僵硬,所以我想我应该把这个扔给集体天才,所以

我有一个被引发的事件(这将出现在“raiser”的线程上),我使用它

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

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的引用


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

也许我的答案在这里?看到这个和这个的答案了吗?是的,这就是答案。线程在其工作完成之前不会被垃圾收集。我喜欢这个答案——它是最有说服力的。