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

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

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

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

===============>>#1 票数: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);
    }
}

===============>>#2 票数:0

我必须调查一下,然后再回覆您。 我的问题似乎是,代码在不同的类,不同的功能中运行,并由不同的线程控制,所有这些线程都试图访问同一条记录。

我试图避免使用固定的延迟。 遇到任何线程问题,一个线程有可能会延迟或阻塞超出我们预期的范围。 通过在具有不同负载的不同服务器硬件上进行部署,这是非常现实的可能性。 在频谱的另一端,即使我延迟一点,我也不希望它过高,尤其是不要30秒。 我的客户将汇入成千上万份文件,而任何明显的延迟都会导致整天汇入。

  ask by Jason Z translate from so

未解决问题?本站智能推荐: