Хотя обычное эмпирическое правило всегда должно вызывать Dispose()
во всех IDisposable
реализациях, Task
и Task<T>
часто являются одним из случаев, когда лучше разрешить финализатору позаботиться об этом.
Причина, по которой Задача реализует IDisposable
, в основном связана с внутренним WaitHandle.Это необходимо для правильной работы продолжений задачи и используется только при наличии продолжения задачи.Если продолжения нет, метод Dispose для задачи не имеет реального эффекта - поэтому в этом случае он не требуется.
При этом в большинстве случаев, когда есть продолжение Task, это часто очень и очень сложно.написать свой код таким образом, чтобы вы могли правильно вызвать Dispose ().Использование операторов обычно не работает с экземплярами Task, так как вызов Task обычно асинхронный по своей природе.Очень легко избавиться от Задачи слишком рано, особенно при использовании оператора using.
Если в вашем случае относительно просто сохранить ссылку на Задачу и правильно вызвать Dispose (),Я бы так и сделал.Однако, если это приведет к усложнению вашей логики, я обычно делаю вид, что Задача не является IDisposable
, и разрешаю ее очистку в финализаторе для Задачи.
Дляболее подробно, я бы порекомендовал прочитать эту ветку на форумах MSDN , где Стивен Тауб подробно описывает, почему Task реализует IDisposable, и предоставляет руководство, аналогичное моему предложению выше.