尤其是当没有实时线程引用它时。

我以为GC会考虑所有.net线程来查找引用...它也会检查其他地方的引用吗?

编辑:实例让我们想象一下,我们在控制台应用程序中,main调用创建本地task1的方法,然后应用task1.ContinueWith(task2)并返回main,主要执行console.readline()。

此时,可能是task1已完成,task2仍未启动,GC可能已启动,并且没有线程引用task2。为什么task2无法获得GC?

EDIT2:可能我说“任务”时使用的单词不正确

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    class Program
    {
        static void Launch()
        {
            var task1 = Task.Run(() => Thread.Sleep(60000))
            task1.ContinueWith(() =>  WriteToFile("Hi"));
        }

        static void Main(string[] args)
        {
            Launch();
            //At this point if a GC occurs which thread or static file has a reference to "()=>WriteTofile("Hi")" ?
            Console.ReadLine();
        }

有一个主线程在等待控制台,一个线程(可能来自线程池)正在运行Sleep。在完成睡眠之后,在WriteToFile线程启动之前,可能会发生GC,不是吗?

最佳答案

task1的引用保留在by the default task scheduler(默认任务计划程序is static)中。

连续is kept alive by task1 直到它被移交给它为止,都分配了任务调度程序(默认情况下在创建时为TaskScheduler.Current)。

(请注意,这些可能不是唯一可能的根源,只是我通过源代码快速找到的根源)

10-07 17:17