Использование CallExternalMethodActivity / HandleExternalEventActivity в StateMachine - PullRequest
2 голосов
/ 27 августа 2009

Я пытаюсь заставить StateMachine выполнить некоторое действие базы данных между состояниями.

Итак, у меня есть «начальное» состояние, которое использует CallExternalMethodActivity для вызова функции «BeginExecuteNonQuery» в классе, украшенном ExternalDataExchangeAttribute. После этого он использует SetStateActivity для перехода в «конечное» состояние.

В «конечном» состоянии используется HandleExternalEventActivity для прослушивания события «EndExecuteNonQuery».

Я могу пройти через локальную службу в функцию "BeginExecuteNonQuery".

Проблема в том, что EndExecuteNonQuery имеет значение null.

public class FailoverWorkflowController : IFailoverWorkflowController
{
    private readonly WorkflowRuntime workflowRuntime;

    private readonly FailoverWorkflowControlService failoverWorkflowControlService;
    private readonly DatabaseControlService databaseControlService;

    public FailoverWorkflowController()
    {
        workflowRuntime = new WorkflowRuntime();
        workflowRuntime.WorkflowCompleted += workflowRuntime_WorkflowCompleted;
        workflowRuntime.WorkflowTerminated += workflowRuntime_WorkflowTerminated;

        ExternalDataExchangeService dataExchangeService = new ExternalDataExchangeService();
        workflowRuntime.AddService(dataExchangeService);

        databaseControlService = new DatabaseControlService();
        workflowRuntime.AddService(databaseControlService);

        workflowRuntime.StartRuntime();
    }

    ...
}

...

public void BeginExecuteNonQuery(string command)
{
    Guid workflowInstanceID = WorkflowEnvironment.WorkflowInstanceId;

    ThreadPool.QueueUserWorkItem(delegate(object state)
                                     {
                                         try
                                         {
                                             int result = ExecuteNonQuery((string)state);
                                             EndExecuteNonQuery(null, new ExecuteNonQueryResultEventArgs(workflowInstanceID, result));
                                         }
                                         catch (Exception exception)
                                         {
                                             EndExecuteNonQuery(null, new ExecuteNonQueryResultEventArgs(workflowInstanceID, exception));
                                         }
                                     }, command);
}

Что я делаю не так с моей реализацией?

-stan

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Я не могу сказать из фрагмента кода, но убедитесь, что вы используете ExternalDataExchangeService для размещения своей службы и не добавляете ее непосредственно во время выполнения. ExternalDataExchangeService отвечает за добавление необходимых обработчиков событий и превращение событий в сообщения в очереди для рабочего процесса.

0 голосов
/ 19 марта 2010

Я использую ExternalDataExchangeService без кода, изменив мой конфигурационный файл, как показано здесь :

...