Я хочу запустити завдання для запуску на фоновому потоці. Я не хочу чекати завершення завдань.
У .net 3.5 я зробив би це:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
У .net 4 TPL є запропонованим способом. Загальна модель, яку я бачив, рекомендувала:
Task.Factory.StartNew(() => { DoSomething(); });
Однак StartNew()
метод повертає Task
об'єкт, який реалізується IDisposable
. Це, мабуть, не помічають люди, які рекомендують цю схему. Документація MSDN щодо Task.Dispose()
методу говорить:
"Завжди дзвоніть у розпорядження, перш ніж випустите останню посилання на завдання."
Ви не можете зателефонувати розпоряджатись завданням, поки воно не буде завершено, тому, якщо зачекати основний потік і розпочати виклик, в першу чергу переможеться точка виконання на фоновому потоці. Також, здається, не було жодної завершеної / завершеної події, яку можна було б використати для очищення.
Сторінка MSDN класу Task цього не коментує, а книга "Pro C # 2010 ..." рекомендує ту саму схему і не коментує видалення завдання.
Я знаю, якщо я просто лишаю його, фіналізатор зловить його врешті-решт, але це повернеться і кусає мене, коли я виконую багато завдань із вогню та забудьте, як це, і фіналізатор переповнюється?
Тому мої запитання:
- Чи прийнятно не дзвонити
Dispose()
поTask
класу в цьому випадку? І якщо так, то чому і чи існують ризики / наслідки? - Чи є документація, яка обговорює це?
- Або є відповідний спосіб утилізації
Task
предмета, який я пропустив? - Або є інший спосіб виконувати завдання з вогнем та забуттям із TPL?