Нужно ли распоряжаться заданием? - PullRequest
17 голосов
/ 13 мая 2011

Мне весело работать с 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 Ответ

18 голосов
/ 13 мая 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...