【发布时间】:2009-04-09 19:21:40
【问题描述】:
我最近一直在 WF 中处理一些基于 ExternalDataExchange 的通信。我的理解是,在使用长时间运行(在本例中为状态机)工作流时,通信是排队的、持久的和事务性的。
我正在使用 SQL Persistence 和一个标记为“WaitForIdle = true”的 EventArgs。
我会假设当我做这样的事情时:
using(TransactionScope scope = new TransactionScope())
{
IMyEDEService service = wfRuntime.GetService<IMyEDEService>()
service.MyMethod(wfInstanceGuid, "Here's some data");
DoSomeDatabaseWork();
} //Dispose causes scope to rollback
我希望我的事件不会在工作流中触发。不过,它似乎实际上已经交付,所以这让我相信这不是交易性的。您可以看到在 DoSomeDatabaseWork() 中提交到数据库的数据是如何回滚的,但是向前推进的工作流可能会很糟糕。
任何人都可以确认这一点,如果可以,您是否有解决方法使消息成为事务性消息?
我真正想要的是以下两件事之一:
- 工作流不应该对我通过外部数据交换入队的消息做出反应,直到将消息入队的事务被提交(就像 SQL Server 中的服务代理所做的那样)。
--或--
- 如果工作流确实开始对我传递的事件起作用,它也应该回滚。不过,我看不出使用默认调度程序是如何发生这种情况的。我希望工作流执行保持异步,所以如果不需要,我不想切换调度程序。
【问题讨论】:
标签: workflow workflow-foundation