2012-03-28 46 views
1

我有一个包含Pick活动的工作流。每个PickBranch由WCF请求触发。触发分支然后发送对请求的响应并执行一个Action活动。但是,我所看到的行为表明,在完成操作活动后才会发送响应,这会导致原始请求超时,具体取决于Action活动需要完成多长时间。工作流选择活动不发送回复,直到动作完成

enter image description here

在上面的PickBranch,我添加工作订单移动数据库。每个工作订单最多需要16秒才能添加到数据库中。随着工单数量的增加,原始请求超时的可能性就越大。我究竟做错了什么?

回答

2

好的,我想我有一个解决方案。根据Maurice's answer here,我在SendReplyToReceive之后添加了一个Delay活动,然后工作流开始按照预期行事。

enter image description here

+0

嗨。即使这个问题在几年前得到了回应,你是否找到了最终解决方案?我有同样的问题,延迟有助于解决它。我只是想知道是否有更好的方法,而不是使用解决方法? – 2017-03-15 11:04:36

+1

嗨里卡多 - 5年在IT方面很长一段时间。不幸的是,我无法再访问该项目的源代码,所以我不能说我是否找到了更好的替代方案,对不起。 – 2017-03-15 20:07:06

+0

完全没问题。谢谢您的回复 :) – 2017-03-16 10:59:23

-1

这是按预期工作的。如果这些操作需要很长时间,那么通过异步调用它们可以更好地服务吗?点击这里,查看AsyncCodeActivity:

http://msdn.microsoft.com/en-us/library/system.activities.asynccodeactivity.aspx

+0

真的吗?这似乎与工作流程显示的顺序相反,即接收请求,发送响应,然后处理操作。如果客户已收到响应,它应该能够继续而无需等待完整的工作流程。 – 2012-03-28 22:32:51

+0

WCF工作流程中的消息传递旨在按照MSDN和其他地方的描述异步使用。当您在其他同步工作流程中拥有异步代码时,应使用异步代码活动。 – 2013-03-27 20:40:43

0

只是测试这一点,它工作正常。如果我在触发器内有一个发送和接收的Pick,并且在动作中有延迟,则立即收到答复。

您确定SendReply活动的请求似乎设置正确吗?

Patrick仍然是对的,您应该将您的数据库活动作为AsyncCodeActivity实现,但这不会成为您的回复被延迟的原因。

+0

谢谢彼得。这个特定的工作流程只是不经常执行,而AsyncCodeActivity在应用程序的上下文中没有意义。不,它不能正常工作。 – 2012-03-29 01:00:16

+0

正是由于您想要执行AsyncCodeActivity实现的工作流的单线程本质。这将释放调度程序线程以将任何其他活动安排到队列中。我已经使用了相同的发送/接收活动,在高度并发的工作流程应用程序中选择模式一段时间,我还没有看到这种行为。如果延迟可以解决您的问题,那么我怀疑将IO绑定操作正确定义为异步代码活动会具有相同的效果,原因可能是调度程序线程上的阻塞调用。 – 2012-03-29 01:19:43

0

我我的阅历检查PersistBeforeSend SendReplyToReceive为True修复了这个问题。在SendReplyToReceive之后放置Persist块也有帮助。