Считается ли допустимым не вызывать 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?