以前在SharePoint Designer里面设计工作流时,经常会遇到“保存冲突”的错误,比如,在更新“审批状态”后,立刻更新流程对象其他属性的时候,就很容易发生该错误。

这两天在按客户需求定制一个可以在流程中创建SPListItem类型的业务对象时,发现“创建新项目”Activity并不能放入正确的位置,而是只能放在列表根目录下,不能放入特定的路径下,于是做了一个“移动项目”的可通用的Activity,这样新建好后,再马上移到正确的位置上,就可以满足要求了。不过做好后发现,移动羡慕出现“列表下找不到实例”的错误,于是想到,有可能WF并没有在第一个Activity完成后马上持久化,而是在特定的时刻一起提交操作,应该和上面的错误同根同源。

 

经过研究,发现工作流持久化只能发生在如下情况下:

1. idle的时候(如使用DelayActivity的时候)。
2. 工作流完成或终止。
3. 当TransactionScopeActivity完成的时候。
4. 当CompensatableSequenceActivity完成的时候。
5. 当一个装饰有PersistOnCloseAttribute的自定义活动完成的时候。
6. 当手动的去调用Unload或TryUnload方法的时候。

 

使用第一种方式,会使工作流等待一段时间,而且由于timer服务是定时去监听,自定义的时间不一定管用,使得工作流运行感觉较慢,所以放弃。

于是新建一个Activity,专门用来持久化,在该Activity上加上[PersistOnCloseAttribute],问题就解决了。

 

参考的文章:

http://www.c-sharpcorner.com/UploadFile/prvn_131971/WorkflowPersistence01242008233113PM/WorkflowPersistence.aspx

http://www.pin5i.com/showtopic-21136.html

posted on 2010-08-25 16:18  重金属  阅读(260)  评论(0编辑  收藏  举报