Я хочу запустить задачу в фоновом потоке. Я не хочу ждать завершения задач.
В .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
, который я пропустил?