2

我试图让 StateMachine 在状态之间执行一些数据库操作。

所以我有一个“开始”状态,它使用 CallExternalMethodActivity 在一个用 ExternalDataExchangeAttribute 修饰的类上调用“BeginExecuteNonQuery”函数。之后,它使用 SetStateActivity 更改为“结束”状态。

“结束”状态使用 HandleExternalEventActivity 来监听“EndExecuteNonQuery”事件。

我可以单步执行本地服务,进入“BeginExecuteNonQuery”函数。

问题是“EndExecuteNonQuery”为空。

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);
}

我的实施做错了什么?

-斯坦

4

2 回答 2

1

我无法从代码片段中看出,但请确保您使用 ExternalDataExchangeService 来托管您的服务,并且不要将您的服务直接添加到运行时。ExternalDataExchangeService 负责添加所需的事件处理程序并将事件转换为工作流的排队消息。

于 2009-08-27T20:14:09.850 回答
0

我通过更改我的配置文件来使用没有代码的 ExternalDataExchangeService,如下所示

于 2010-03-19T14:08:38.553 回答