Могут ли экземпляры .NET Task выйти из области видимости во время выполнения? - PullRequest
41 голосов
/ 06 мая 2010

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

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

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

Ответы [ 2 ]

32 голосов
/ 06 мая 2010

Обновление:

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

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

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


Оригинал:

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

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

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

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

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

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

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


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

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

13 голосов
/ 06 мая 2010

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

...