Как передать объект состояния в задачу продолжения?
Я использую параллельную библиотеку задач .NET 4.0 с С# (мой первый раз с использованием TPL)
У меня есть задача A, которую я хочу выполнить до завершения, прежде чем отпустить кучу других задач (B, C, D и т.д.). Поэтому я хочу создавать задачи B, C, D и т.д. В качестве продолжения задачи A.
Тем не менее, я хочу передать объект "state" в задачу B, другой объект состояния для задачи C и т.д.
Я могу передать объект состояния в задачу A, просто используя перегрузку конструктора задачи, которая принимает объект состояния, например http://msdn.microsoft.com/en-us/library/dd783035.aspx описывает эту перегрузку конструктора задачи:
Task(Action<Object>, Object, CancellationToken)
Это отлично работает, а второй аргумент - мой объект state.
Я хочу создать задачу продолжения, например. для задачи B:
Task taskB = taskA.ContinueWith(/* args here*/)
Однако я не вижу перегрузки ContinueWith() (см. http://msdn.microsoft.com/en-us/library/dd235663.aspx), которая позволяет мне передать объект 'state' в задачу продолжения. Как это можно сделать?
Примечания:
- У меня нет объекта 'state' для taskB, доступного в момент создания taskA
- Объект 'state' для taskB не является результатом (возвращаемым значением) задачиA
В некотором контексте то, что я делаю, это создание taskB, taskC и т.д. внутри пары циклов, поэтому я передаю значение переменных цикла для taskB, taskC и т.д., используя объект состояния, чтобы избегайте проблемы всегда заканчиваться конечным значением переменных цикла в задачах (проблема закрытия).
Ответы
Ответ 1
Простейшим подходом, вероятно, было бы просто захватить его в Func<Task, TResult>
, который вы передадите в ContinueWith
. Например:
object taskBState = GetStateHere();
Task taskB = taskA.ContinueWith(task => RealContinuation(task, taskBState));
Лично мне легче зафиксировать состояние, подобное тому, что все равно передало состояние.
Ответ 2
Вы не можете. Они ожидают, что вы будете использовать силу закрытия. Просто определите дополнительную переменную внутри циклов, чтобы зафиксировать текущее значение для этого закрытия. См. этот ответ от Jon Skeet для получения более подробной информации о захвате и закрытии.
Обновление: Или Джон Скит может избить меня, чтобы ответить прямо на ваш вопрос, говоря точно то же самое.:)