Я хочу вызвать задачу для запуска в фоновом потоке. Я не хочу ждать завершения задач.
В .net 3.5 я бы сделал следующее:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
В .net 4 предлагается TPL. Общим примером, который я видел, является:
Task.Factory.StartNew(() => { DoSomething(); });
Однако метод StartNew()
возвращает Task
, который реализует IDisposable
. Эта
кажется, не обращают внимания люди, которые рекомендуют этот образец. Документация MSDN в Task.Dispose()
говорит:
"Всегда вызывайте Dispose перед тем, как вы отпустите свою последнюю ссылку на Задачу."
Вы не можете вызывать dispose по заданию до тех пор, пока она не будет завершена, поэтому, если основной поток будет ждать, и вызов dispose будет побеждать точку выполнения в фоновом потоке в первую очередь. Кроме того, похоже, что не было завершенного/завершенного события, которое можно было бы использовать для очистки.
Страница MSDN в классе Task не комментирует это, и книга "Pro С# 2010..." рекомендует тот же шаблон и не комментирует удаление задачи.
Я знаю, что если я просто оставлю это, финализатор поймает его в конце, но будет ли это возвращаться и укусить меня, когда я буду много огня и забыть о задачах, подобных этому, и поток финализатора будет перегружен?
Итак, мои вопросы:
- Допустимо ли в этом случае не вызывать
Dispose()
в классеTask
? И если да, то почему и есть ли риски/последствия? - Есть ли какая-либо документация, которая обсуждает это?
- Или существует ли способ утилизации объекта
Task
, который я пропустил? - Или есть другой способ сделать огонь и забыть задачи с помощью TPL?