代码之家  ›  专栏  ›  技术社区  ›  Michael Entin

执行异步操作的自定义Windows工作流活动-使用通用服务重做

  •  2
  • Michael Entin  · 技术社区  · 17 年前

    我找到的所有样品(例如。 this one by Kirk Evans )涉及完成大部分工作的自定义工作流服务,然后将事件发布到活动创建队列。主要原因似乎是发布事件[从非WF线程工作]的唯一方法是WorkflowInstance.EnqueueItem,而活动无权访问工作流实例,因此它们无法发布事件(从非WF线程,我在那里收到异步操作的结果)。

    因此,我编写了以下通用服务,我从activitys async事件处理程序调用该服务,它可以被各种异步活动重用(错误处理省略):

    class WorkflowEnqueuerService : WorkflowRuntimeService
    {
        public void EnqueueItem(Guid workflowInstanceId, IComparable queueId, object item)
        {
            this.Runtime.GetWorkflow(workflowInstanceId).EnqueueItem(queueId, item, null, null);
        }
    }
    

    现在,在活动代码中,我可以获取并存储对该服务的引用,启动异步操作,当它完成时,使用该服务将事件发布到队列中。这样做的好处是——我将所有特定于活动的代码都保存在活动中,并且不必为每种活动类型添加新的服务。

    但是,看到官方和互联网的样本会使用专门的不可重用服务,我想检查一下这种方法是否可行,或者我在这里制造了一些问题?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Maurice    17 年前

    这里有一个关于工作流持久性的潜在问题。

    如果创建在数据库中持久化的长时间运行的Workflow,则运行时将能够重新启动这些工作流,直到出现一些外部事件重新加载它们,这些工作流才会重新加载到内存中。在那里,它们自己负责触发事件,但在重新加载之前不能触发。我们有一个陷阱22:-(

        2
  •  0
  •   Michael Entin    17 年前

    后续行动-不管所有原因,也不管为什么要使用服务“完成”,这将由.NET 4.0直接支持,它为活动提供了一种干净的方式来启动异步工作,同时暂停活动的持久性。

    看见 http://msdn.microsoft.com/en-us/library/system.activities.codeactivitycontext.setupasyncoperationblock(VS.100).aspx

    推荐文章