关于多线程:Sharepoint COMException 0x81020037

关于多线程:Sharepoint COMException 0x81020037

Sharepoint COMException 0x81020037

我正在开发一个SharePoint应用程序,该应用程序支持在单个操作中导入多个文档。我也有一个ItemAdded事件处理程序,它对项目元数据执行一些基本维护。导入的文档和手动创建的文档都会触发此事件。难题的最后一部分是批处理操作功能,我实现了该功能来启动工作流并更新另一个元数据字段。

我可以通过提取SPListItem的文件数据来引起COMException 0x81020037。该文件只是一个InfoPath表单/ XML文档。我能够修改XML,并将其成功推回SPListItem。当我此后立即关闭自定义功能并修改元数据时,有时会导致COM错误。

该错误消息基本上表明该文件已被另一个线程修改。在自定义功能更改元数据时,ItemAdded事件似乎仍在将文件写回到数据库中。我尝试放入延迟和错误捕获循环,以尝试检测到SPListItem可以安全修改且几乎没有成功。

有没有办法判断另一个线程在文档上是否有锁?


有时我看到ItemAddedItemUpdated一次操作触发两次。
您可以尝试在ItemAdded()方法中放置一个断点以确认这一点。

在我的情况下,解决方案是对ItemAdded()方法进行单线程处理:

1
2
3
4
5
6
7
8
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秒。我的客户将汇入成千上万份文件,而任何明显的延迟都会导致整天汇入。


推荐阅读