Edu*_*ard 2 .net garbage-collection task-parallel-library
特别是当没有实时线程引用它时。
我认为 GC 会考虑所有 .net 线程来查找引用...它是否也检查其他地方的引用?
编辑:例如,假设我们在控制台应用程序中,主调用创建本地 task1 的方法,然后应用 task1.ContinueWith(task2) 并返回主,主执行 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();
}
Run Code Online (Sandbox Code Playgroud)
有一个主线程在等待控制台,一个线程(可能来自线程池)运行 Sleep。就在 Sleep 完成之后,在 WriteToFile 线程开始之前,GC 可能会发生,不是吗?
对的引用由默认任务调度程序task1持有,(默认任务调度程序是 static)。
延续一直保持活动状态,task1直到将其移交给分配给它的任务调度程序(TaskScheduler.Current默认情况下在创建时)。
(注意,这些可能不是唯一可能的根源,只是我在查看源代码时很快发现的那些)