У меня есть длительная задача, которую я реализовал с помощью параллельной библиотеки задач. Когда задача запускается, я захватываю снимки нескольких входных значений и коллекций, а затем выполняю различные операции с использованием этой информации. Если какое-либо из этих значений или коллекций изменяется во время выполнения задачи, я бы хотел, чтобы Task Task снова выполнялся сразу после завершения. Должен ли я создавать новую задачу или есть способ повторно использовать существующую задачу? Каков наилучший способ начать вторую итерацию?Как перезапустить/повторно использовать повторяющуюся задачу?
ответ
Создайте новую задачу.
Как указано http://msdn.microsoft.com/en-us/library/dd270682.aspx, попытка перезапуска запущенной или завершенной задачи не поддерживается. Редко бывает хорошей идеей делать что-то, что обычно вызывает исключение, и повторное использование Задачи - одна из тех вещей.
Вы не можете начать повторное создание существующего Task
. Таким образом, у вас есть два варианта:
- Запустить новый
Task
. Вероятно, это чище. - Запустите цикл в вашем
Task
, который проверяет, что-то изменилось с последнего раза, и если это произойдет, начинается новая итерация.
Тот же вопрос, что и выше: Как бы вы указали на необходимость второй задачи? – SonOfPirate
Трудно сказать, не зная, как вы определяете, что требуется вторая задача. Если вы хотите перезапустить даже после его завершения, вы можете использовать события. – svick
Вы также можете использовать логику программы рефакторинга для использования указателей функций (или делегатов в VB.NET).
Как бы вы указали на необходимость второй задачи? Изменения могут возникать во время выполнения исходной задачи или до тех пор, пока она не завершится. – SonOfPirate
Основываясь на этих критериях, я думаю, что вы справитесь с одиночной, не заканчивающейся задачей, которая опросит текущее состояние, и если состояние изменится, сделайте свою вещь. Основное требование здесь состоит в том, что это происходит асинхронно, чтобы избежать блокировки основного потока. Вам нужно будет поместить какой-либо флаг, чтобы указать Задаче, что приложение закрывается, и оно должно завершиться. –
Единственная, не заканчивающаяся задача - это то, о чем я думал. Я могу использовать CancellationToken для обработки, когда приложение закрывается, но я не уверен, какой механизм я должен использовать, чтобы отметить, что мне нужна задача для выполнения моих алгоритмов. Если я использую AutoResetEvent, то я не смогу отменить, потому что поток Task будет приостановлен в ожидании события. С другой стороны, я читаю, что использование SpinWait очень интенсивно. – SonOfPirate