Считается ли приемлемым не вызывать Dispose () для объекта TPL Task?

Я хочу запустить задачу в фоновом потоке. Я не хочу ждать завершения задач.

В .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 C # 2010 ...» рекомендуется тот же шаблон и не комментирует удаление задач.

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

Мои вопросы:

  • Можно ли в этом случае не вызывать Dispose () в классе Task ? И если да, то почему и существуют ли риски / последствия?
  • Есть ли документация, в которой это обсуждается?
  • Или есть подходящий способ избавиться от объекта Task , который я пропустил?
  • Или есть другой способ выполнить задачи «запустить и забыть» с помощью TPL?

117
задан Simon P Stevens 17 September 2010 в 09:51
поделиться