Действительно ли.NET может Определить задачу для экземпляров, выходят из объема во время выполнения?

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

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

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

42
задан kemiller2002 6 May 2010 в 16:52
поделиться

2 ответа

Обновление:

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

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

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


Оригинал:

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

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

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

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

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

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

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


¹ Согласно документации:

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

32
ответ дан 26 November 2019 в 23:58
поделиться

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

13
ответ дан 26 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: