以前在SharePoint Designer里面设计工作流时,经常会遇到“保存冲突”的错误,比如,在更新“审批状态”后,立刻更新流程对象其他属性的时候,就很容易发生该错误。
这两天在按客户需求定制一个可以在流程中创建SPListItem类型的业务对象时,发现“创建新项目”Activity并不能放入正确的位置,而是只能放在列表根目录下,不能放入特定的路径下,于是做了一个“移动项目”的可通用的Activity,这样新建好后,再马上移到正确的位置上,就可以满足要求了。不过做好后发现,移动羡慕出现“列表下找不到实例”的错误,于是想到,有可能WF并没有在第一个Activity完成后马上持久化,而是在特定的时刻一起提交操作,应该和上面的错误同根同源。
经过研究,发现工作流持久化只能发生在如下情况下:
1. idle的时候(如使用DelayActivity的时候)。
2. 工作流完成或终止。
3. 当TransactionScopeActivity完成的时候。
4. 当CompensatableSequenceActivity完成的时候。
5. 当一个装饰有PersistOnCloseAttribute的自定义活动完成的时候。
6. 当手动的去调用Unload或TryUnload方法的时候。
使用第一种方式,会使工作流等待一段时间,而且由于timer服务是定时去监听,自定义的时间不一定管用,使得工作流运行感觉较慢,所以放弃。
于是新建一个Activity,专门用来持久化,在该Activity上加上[PersistOnCloseAttribute],问题就解决了。
参考的文章: