【发布时间】:2016-07-22 16:13:01
【问题描述】:
尤其是当没有活动线程引用它时。
我认为 GC 会考虑所有 .net 线程来查找引用...它是否也检查其他地方的引用?
编辑:例如让我们假设我们在一个控制台应用程序中,main 调用一个创建本地 task1 的方法,然后应用 task1.ContinueWith(task2) 并返回到 main,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和task2是Tasks,task1.ContinueWith(task2)不会编译。 -
您认为“仍未开始”是有效场景的假设是不正确的,task2 在 task1 完成后立即开始。如果线程池运行缓慢,那么它仍然无关紧要,因为线程池队列有对它的引用。注意 task 参数是如何在 this code 中传递的。
-
我没有任何代码。这只是理论上的。关于线程池队列,并不是所有的任务都由线程池执行,不是吗?线程池队列何时引用task2?
标签: .net garbage-collection task-parallel-library