Выполнение детской активности во второй раз - PullRequest
0 голосов
/ 26 ноября 2009

Я пытаюсь написать пользовательскую CompositeActivity с использованием WF3.5. Что-то вроде whileActivity.

Проблема в том, что когда я хочу снова выполнить дочернее действие (ранее оно успешно завершается с последним вызовом ActivityExecutionContext.CloseActivity ()), я получаю исключение InvalidOperationException с этим сообщением: «Для выполнения состояние активности должно быть« Инициализировано » .

После отладки проблемы выясняется, что ExecutionStatus дочернего действия закрыт, а его ExecutionResult неинициализирован.

Но документ MSDN для ActivityExecutionContext.ExecuteActivity говорит, что «Если статус закрыт, действие инициализируется и выполняется».

Так почему я получаю это исключение и как его избежать?

Спасибо, Julien

1 Ответ

1 голос
/ 27 ноября 2009

Я думаю, что нашел ответ. Составное действие должно создавать новый ActivityExecutionContext для дочернего действия каждый раз, когда оно хочет запустить дочернее действие.

Выполнение дочернего действия в новом ActivityExecutionContext:

ActivityExecutionContext context2 = executionContext.ExecutionContextManager.CreateExecutionContext(a);

// listen for the child's activity completion by implementing IActivityEventListener<ActivityExecutionStatusChangedEventArgs>
context2.Activity.RegisterForStatusChange(Activity.ClosedEvent, this);
context2.ExecuteActivity(context2.Activity);

Уборка после закрытия мероприятия:

// get the activity from the ActivityExecutionStatusChangedEventArgs, then...
activity.UnregisterForStatusChange(Activity.ClosedEvent, this);
ActivityExecutionContextManager executionContextManager = executionContext.ExecutionContextManager;

// close the child activity's execution context
executionContextManager.CompleteExecutionContext(executionContextManager.GetExecutionContext(activity));
...