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