Подтвердить что ты не робот

Могут ли экземпляры .NET Task выходить из области действия во время запуска?

Если у меня есть следующий блок кода в методе (с использованием .NET 4 и параллельной библиотеки задач):

var task = new Task(() => DoSomethingLongRunning());
task.Start();

и метод вернет, удастся ли эта задача выйти из области видимости и собрать мусор, или она будет запущена до завершения? Я не заметил никаких проблем с GCing, но хочу убедиться, что я не настроюсь на гонку с GC.

4b9b3361

Ответ 1

Update:

После того, как я ответил на этот вопрос (давным-давно!), я узнал, что это не так, что задачи всегда будут выполняться до завершения - есть небольшой, пусть говорят, "угловой" случай, когда задачи могут не закончиться.

Причиной этого является следующее: как я уже говорил ранее, задачи - это, по существу, потоки; но они являются фоновыми потоками. Фоновые потоки автоматически прерываются, когда заканчиваются все потоки переднего плана. Итак, если вы ничего не делаете с задачей и программой заканчивается, есть шанс, что задача не будет завершена.

Вы всегда должны ждать выполнения задач. Более подробную информацию можно найти на отличном ответе, который дал мне Джон.


Оригинал:

Задача запланирована для ThreadPool, что означает, что они являются, по существу, нитями¹ (фактически они инкапсулируют потоки).

Из Документация по темам:

Нет необходимости сохранять ссылку на объект Thread после того, как вы начали поток. Нить продолжает выполняться до тех пор, пока поток процедура завершена.

Итак, нет, нет необходимости сохранять ссылку на него.

Кроме того, в документации указывается, что предпочтительным способом создания Задачи является ее использование factory:

Вы также можете использовать метод StartNew создать и запустить задачу в одном операция. Это предпочтительный способ создавать и запускать задания при создании и планирование не обязательно должно быть разделенные (...)

Надеюсь, что это поможет.


¹ В соответствии с документация:

Задача представляет собой асинхронную и в некотором смысле это напоминает создание нового потока или ThreadPool, но при более высокий уровень абстракции.

Ответ 2

Задача будет завершена. Даже если нет никаких других ссылок на него (не в корне, я считаю, это термин), пул потоков по-прежнему будет ссылаться на него и не позволит ему быть собранным Мусором, по крайней мере (я говорю, по крайней мере, потому что даже после его завершения, нет гарантии, что это будет сбор мусора) до завершения.