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