Sharepoint COMException 0x81020037

时间:2008-08-22 13:33:37

标签: multithreading sharepoint com

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

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

错误消息基本上表示该文件已被另一个线程修改。当自定义功能正在更改元数据时,似乎ItemAdded事件仍在将文件写回数据库。我已经尝试输入延迟和错误捕获循环来尝试检测SPListItem是否可以安全修改但收效甚微。

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

2 个答案:

答案 0 :(得分:1)

有时候我会看到ItemAddedItemUpdated两次点击一次。 您可以尝试在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);
    }
}

答案 1 :(得分:0)

我将不得不调查并回复你。我的问题似乎是,在不同的类中运行代码,在不同的功能中,由不同的线程控制,所有这些代码都试图访问相同的记录。

我试图避免使用固定延迟。对于任何线程问题,存在一个线程可能延迟或阻止超出我们预期的病态可能性。通过在具有不同负载的不同服务器硬件上进行部署,这是非常现实的可能性。在光谱的另一端,即使我要延迟,我也不希望它非常高,特别是30秒。我的客户将导入数以万计的文件,任何长度的延迟都会导致导入整天占用。