1

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

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

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

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

4

2 回答 2

1

有时我会看到ItemAddedorItemUpdated为单个操作触发两次。您可以尝试在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);
    }
}
于 2008-08-22T15:48:33.197 回答
0

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

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

于 2008-08-22T16:25:21.967 回答