особенно когда нет прямой ссылки Ссылка на него.Почему сборщик мусора не собирает объекты Задачи
Я думал, что GC продумал все .net темы, чтобы найти ссылки ... Он проверяет ссылки в других местах тоже?
РЕДАКТИРОВАТЬ: Пример экземпляра Давайте представим, что мы находимся в консольном приложении, главный вызов метода, который создает локальную задачу1, затем применяет task1.ContinueWith (task2) и возвращается к main, main do console.readline().
На данный момент это может быть так, что task1 завершен, task2 все еще не запускает GC, который может запускаться, и ни один поток не имеет ссылки на task2. Почему task2 не получает GC'ed?
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();
}
Существует основной поток ждет консоли, одна нити (может быть от ThreadPool) работает в спящем режиме. Как только сон закончится, и до начала потока WriteToFile, GC может произойти, не так ли?
Не могли бы вы показать проблему, используя какой-то фактический код? Предполагая, что 'task1' и' task2' являются 'Task', 'task1.ContinueWith (task2)' не будет компилироваться. – svick
Ваше предположение о том, что «все еще не запущено», является допустимым сценарием, просто неверно, task2 запускается * немедленно * после завершения задачи1. Если threadpool работает медленно, это все равно не имеет значения, поскольку очередь threadpool имеет ссылку на него. Обратите внимание, что аргумент * task * передается в [этот код] (http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/ThreadPoolTaskScheduler.cs,33cd274e06874569). –
У меня нет кода. Это просто теоретически. Что касается очереди threadpool, не все задачи выполняются threadpool, не так ли? В какой момент task2 получает ссылку на очередь threadpool? – Eduard