Нужно ли распоряжаться заданием?

Мне весело работать с 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> часто это тот случай, когда лучше позволить финализатору позаботиться об этом.

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

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

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

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

Другие вопросы по тегам