Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading_Garbage Collection - Fatal编程技术网

C# 新线程()和垃圾收集

C# 新线程()和垃圾收集,c#,multithreading,garbage-collection,C#,Multithreading,Garbage Collection,我有以下代码: new Thread(new ThreadStart(delegate() { while (true) { //something } })).Start(); 垃圾收集器能否在处于运行状态时完成线程的此实例?否;正在运行的线程计为根。不会收集正在运行的线程,也不会收集该线程堆栈的活动部分引用的任何内容。CLR会跟踪所有正在运行的线程。只要存在对对象的引用,它们就不会被垃圾收集。由于CLR保留对所有正在运行的线程的引用,GC不会接触它们

我有以下代码:

new Thread(new ThreadStart(delegate()
{
    while (true)
    {
        //something
    }
})).Start();

垃圾收集器能否在
处于运行状态时完成
线程的此实例?

否;正在运行的线程计为根。不会收集正在运行的线程,也不会收集该线程堆栈的活动部分引用的任何内容。

CLR会跟踪所有正在运行的线程。只要存在对对象的引用,它们就不会被垃圾收集。由于CLR保留对所有正在运行的线程的引用,GC不会接触它们。

不会收集线程,因为GC会使用每个正在运行、等待或挂起的线程来决定哪些线程是活动的(跟踪每个线程堆栈中的所有内容,跟踪所有这些对象引用的所有内容,然后跟踪这些对象引用的所有内容,依此类推,您已经确定了无法垃圾收集的所有内容)

如果该线程是后台线程,则该线程可能会结束,因为当进程中的所有其他线程完成时,该线程将被主动关闭。否则,唯一会导致该线程死亡的是正在主动退出的进程,这是一个异常(包括
ThreadAbortException
)或者它在循环本身的时候打破了

有一个案例在某些方面具有可比性,这可能就是你所想的:

var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5));
int someResult = doingSomethingElse();
doSomethingElseThatTakesLongerThan5Seconds();
这是导致另一个执行线程执行某些操作的另一段代码。在这种情况下,计时器确实可以在运行之前、运行期间或构造函数返回后的任何时间进行垃圾收集


这里重要的一点是,计时器没有单独的线程,线程甚至不“知道”计时器对象。因为对象的最后一次访问已经发生,所以它符合收集条件。这与正在运行(或等待等)的单独线程不同.

所有正在运行的计时器、线程、线程池和任务都标记为根。因此,它们只有在完成(执行完毕)时才会被垃圾收集,或者在应用程序关闭时被删除。

正在运行的线程计为根?或引用(在线程内部)哪个对对象的引用算作根?@Royi roots-基本上是堆栈局部变量。请注意arg0(又名this)通常会使目标实例保持活动状态,那么说:GC不允许收集正在运行的线程是错误的/确定的吗?@Royi好吧,实际线程首先不是托管对象。
thread
类型主要是帮助与CLI线程对话的实用程序,CLI线程有时是,有时不是与OS线程的1:1映射(sql server是“isnt”的一个例子。)@Royi这是没有意义的。这里唯一管理的东西是
线程,但那不是线程。
线程
里面没有“东西”因此,线程是根线程,不可收集。
线程
是否可收集将是一个实现细节。