[英]Sharepoint COMException 0x81020037
我正在开发一个SharePoint应用程序,该应用程序支持在单个操作中导入多个文档。 我还有一个ItemAdded事件处理程序,该处理程序对项目元数据执行一些基本维护。 导入的文档和手动创建的文档都会触发此事件。 难题的最后一部分是批处理操作功能,我实现了该功能以启动工作流并更新另一个元数据字段。
我可以通过提取SPListItem的文件数据来引起COMException 0x81020037。 该文件只是一个InfoPath表单/ XML文档。 我能够修改XML,并将其成功推回SPListItem。 当我此后立即关闭自定义功能并修改元数据时,有时会导致COM错误。
该错误消息基本上表明该文件已被另一个线程修改。 在自定义功能更改元数据时,ItemAdded事件似乎仍在将文件写回到数据库中。 我尝试放入延迟和错误捕获循环,以尝试检测到SPListItem可以安全修改且几乎没有成功。
有没有办法判断另一个线程在文档上是否有锁?
有时,我一次执行一次会看到ItemAdded
或ItemUpdated
触发两次。 您可以尝试在ItemAdded()
方法中放置一个断点以确认这一点。
我的解决方案是单线程ItemAdded()
方法:
private static object myLock = new object();
public override void ItemAdded(SPItemEventProperties properties) {
if (System.Threading.Monitor.TryEnter(myLock, TimeSpan.FromSeconds(30))
{
//do your stuff here.
System.Threading.Monitor.Exit(myLock);
}
}
我必须调查一下,然后再回覆您。 我的问题似乎是,代码在不同的类,不同的功能中运行,并由不同的线程控制,所有这些线程都试图访问同一条记录。
我试图避免使用固定的延迟。 遇到任何线程问题,一个线程有可能会延迟或阻塞超出我们预期的范围。 通过在具有不同负载的不同服务器硬件上进行部署,这是非常现实的可能性。 在频谱的另一端,即使我延迟一点,我也不希望它过高,尤其是不要30秒。 我的客户将汇入成千上万份文件,而任何明显的延迟都会导致整天汇入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.