Мне нужно избавиться от задачи?

Мне нравится работать с System.Threading.Tasks. Однако многие из примеров кода, которые я вижу, выглядят примерно так:

Dim lcTask = Task.Factory.StartNew(Sub() DoSomeWork())
Dim lcTaskLong = Task.Factory.StartNew(Sub() DoSomeWork(), TaskCreationOptions.LongRunning)
Task.WaitAll(lcTask, lcTaskLong)

То, что степень выборки.
Задачи реализуют IDisposable, поэтому, очевидно, я должен их распоряжаться, но что, если я просто хочу "Огонь и забыть"?

Если я не распоряжаюсь, я буду утечка потоков/дескрипторов/памяти/кармы? Я использую задачи "неправильно"? (Нужно просто использовать делегата и оставить задачи самостоятельно?)

Можно ли разместить в ContinueWith()? (Это похоже на игру в русскую рулетку.)

Ответ 1

В то время как нормальное правило состоит в том, чтобы всегда вызывать Dispose() для всех реализаций IDisposable, Task и Task<T> часто являются одним из случаев, когда лучше разрешить финализатору это.

Причина Task реализует IDisposable в основном из-за внутреннего WaitHandle. Это необходимо для правильной работы задач и используется только в случае продолжения задачи. Если продолжения нет, метод Dispose Task не имеет реального эффекта, поэтому в этом случае он не требуется.

В большинстве случаев, когда есть продолжение задачи, часто очень и очень сложно писать код таким образом, чтобы вы могли правильно вызвать Dispose(). Использование операторов обычно не работает с экземплярами Task, так как вызов Task обычно является асинхронным по своей природе. Это очень легко избавиться от задачи слишком рано, особенно при использовании оператора using.

Если в вашем случае относительно просто сохранить ссылку на Задачу и правильно вызвать Dispose(), я бы сделал это. Однако, если это приведет к тому, что ваша логика станет намного сложнее, я обычно делаю вид, что Task не является IDisposable и разрешает его очищать в финализаторе для задачи.

Для более подробной информации я рекомендовал бы прочитать этот поток на форумах MSDN, где Стивен Туб описывает, почему Task реализует IDisposable в деталях и предоставляет аналогичное руководство моему предложению выше.