我最近一直在 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 中所做的那样)。
- 或者 -
- 如果工作流确实开始对我交付的事件起作用,它也应该回滚。不过,我看不出使用默认调度程序是如何发生这种情况的。我希望工作流执行保持异步,所以如果不需要,我不想切换调度程序。