2012-02-27 4 views
13

У меня есть длительная задача, которую я реализовал с помощью параллельной библиотеки задач. Когда задача запускается, я захватываю снимки нескольких входных значений и коллекций, а затем выполняю различные операции с использованием этой информации. Если какое-либо из этих значений или коллекций изменяется во время выполнения задачи, я бы хотел, чтобы Task Task снова выполнялся сразу после завершения. Должен ли я создавать новую задачу или есть способ повторно использовать существующую задачу? Каков наилучший способ начать вторую итерацию?Как перезапустить/повторно использовать повторяющуюся задачу?

ответ

11

Создайте новую задачу.

Как указано http://msdn.microsoft.com/en-us/library/dd270682.aspx, попытка перезапуска запущенной или завершенной задачи не поддерживается. Редко бывает хорошей идеей делать что-то, что обычно вызывает исключение, и повторное использование Задачи - одна из тех вещей.

+0

Как бы вы указали на необходимость второй задачи? Изменения могут возникать во время выполнения исходной задачи или до тех пор, пока она не завершится. – SonOfPirate

+0

Основываясь на этих критериях, я думаю, что вы справитесь с одиночной, не заканчивающейся задачей, которая опросит текущее состояние, и если состояние изменится, сделайте свою вещь. Основное требование здесь состоит в том, что это происходит асинхронно, чтобы избежать блокировки основного потока. Вам нужно будет поместить какой-либо флаг, чтобы указать Задаче, что приложение закрывается, и оно должно завершиться. –

+0

Единственная, не заканчивающаяся задача - это то, о чем я думал. Я могу использовать CancellationToken для обработки, когда приложение закрывается, но я не уверен, какой механизм я должен использовать, чтобы отметить, что мне нужна задача для выполнения моих алгоритмов. Если я использую AutoResetEvent, то я не смогу отменить, потому что поток Task будет приостановлен в ожидании события. С другой стороны, я читаю, что использование SpinWait очень интенсивно. – SonOfPirate

1

Вы не можете начать повторное создание существующего Task. Таким образом, у вас есть два варианта:

  1. Запустить новый Task. Вероятно, это чище.
  2. Запустите цикл в вашем Task, который проверяет, что-то изменилось с последнего раза, и если это произойдет, начинается новая итерация.
+0

Тот же вопрос, что и выше: Как бы вы указали на необходимость второй задачи? – SonOfPirate

+0

Трудно сказать, не зная, как вы определяете, что требуется вторая задача. Если вы хотите перезапустить даже после его завершения, вы можете использовать события. – svick

0

Вы также можете использовать логику программы рефакторинга для использования указателей функций (или делегатов в VB.NET).