【问题标题】:Invoke Child Workflow Activity Asynchronously异步调用子工作流活动
【发布时间】:2012-02-14 20:17:23
【问题描述】:

团队:

我需要从 WF 服务 (XAMLX) 异步调用 WF 活动 (XAML)。我已经在引用 Microsoft.Activities.Extensions 框架,并且我在状态机的 Platform Update 1 上运行——所以如果解决方案已经在其中一个库中,我已经准备好了!

现在,我需要异步调用该活动 (XAML),但它有一个输出参数,需要在服务 (XAMLX) 中设置一个变量。有人可以帮我解决这个问题吗?

谢谢!


* 更新 *

现在我可以发图片了,*我想*,因为我有足够的声望!让我在这里放几个,试着更好地解释我的问题。第一张图片是具有两个工作流入口点的 WF 服务 -- 第二张是工作流本身。

此工作流程是一种不断重启自身的编排机制,并具有一些故障转移机制(例如,在错误阈值时退出和软退出),以便我们可以使用 WF 管理我们的持久事务队列!

现在,当它只是一个 WF 服务时,我们的工作流运行良好,因为我们可以调用该服务,获取响应并将该响应的值发送回触发器中的另一个入口点以发出软退出。但是,出现了一个新要求,要求我们将工作流本身设置为另一个项目中的 WF 活动,并在 WF 服务应用程序项目中具有接收/发送-回复序列。

但是,我们需要能够启动这个工作流并忘记它——然后让它知道以后需要软退出——但是由于 WF 在单个线程上执行,这已成为一个充其量有点挑战性。

【问题讨论】:

    标签: workflow-foundation-4 workflow-activity workflowservice


    【解决方案1】:

    严格来说,在 XAML 活动中,Parallel 和 ParallelForEach 是您执行异步的方式。

    工作流调度程序只使用一个线程(很像 UI),因此任何正在运行的活动通常都在同一个线程上运行,除非它实现了 AsyncCodeActivity,在这种情况下,您只需将调度程序线程交还给运行时在等待来自 AsyncCodeActivity 实现正在调用的任何异步代码的回调时。

    因此,您确定这是您想要实现的目标吗?您的意思是在发送初始响应后要运行它吗?在这种情况下,请将您的活动放在发送回复之后。

    如果这些建议不能回答您的问题,请提供更多信息。/

    更新: 提出的原始需求(将实现与服务接收/发送活动分开)实际上可以通过将目标活动托管为服务来解决。请参阅以下链接 http://blog.petegoo.com/index.php/2011/09/02/building-an-enterprise-workflow-system-with-wf4/

    【讨论】:

    • 我们有一个要求,它迫使我们将所有消息传递(接收/发送-回复)放在一个项目中,然后将这些消息的实际流放在另一个项目中的 XAML 活动中。所以,我需要做的是在 Receive/Send-Reply 活动之间生成 XAML 活动,允许它设置它的一个输出参数,它是一个状态对象(允许我稍后与它通信),然后返回给发送者。
    • 不要认为这是可能的。如果您使用并行,您的 xaml 活动可以使用 InOut 参数,并且设置它会影响父工作流中的绑定变量,但您无法将控制权交还给工作流。即使您的其他并行分支处于循环中,您也会不必要地旋转等待设置变量。你能从工作流中播种状态/相关对象吗?
    • 这取决于您所说的“主机”是什么意思。 WorkflowServiceHost 仅采用单个 wf 服务/活动定义。另一种方法是使您的目标活动成为一种“范围”活动,例如 TryCatch、ForEach 等,其中 Receive 实际上作为 ActivityDelegate 传递给目标活动,并且目标活动使用相关参数调用 Receive
    • 为什么要求有单独的 XAML 活动?如果要改变创作体验,请阅读my blog post on the subject。如果您可以打破从接收活动中返回某些内容的要求,那么事情应该会变得更容易。请参阅我之前关于播种相关信息等的评论。对于软退出,您可以考虑使用带有 Pick 的 CancellationScope,其中选择的另一个分支是接收传入消息和/或错误阈值等。跨度>
    • 事实上,它使用开箱即用的 WorkflowServiceHost 将 XAML 活动作为服务托管。自定义 WorkflowServiceHostFactory 允许您以任何您想要的方式对其进行配置。 WSH 已经支持标准 XAML 活动(或任何从 Activity 派生的活动),只是从来没有很好地记录该功能。 creationEndpoint 不再需要 Receive 活动来创建实例。您可以将其视为在没有 XAMLX 的情况下将活动托管为服务。只要不使用任何接收,您仍然可以使用 WorkflowInvoker 运行活动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多