我正在开发一个支持在单个操作中导入多个文档的SharePoint应用程序。我还有一个ItemAdded事件处理程序,它执行项元数据的一些基本维护。此事件将触发导入的文档和手动创建的文档。最后一个难题是批处理操作功能,我实现该功能以启动工作流并更新另一个元数据字段。
我能够通过提取SPListItem的文件数据来引发COMException 0x81020037。该文件只是一个InfoPath表单/ XML文档。我能够修改XML并成功地将其推回到SPListItem中。当我立即关闭自定义功能并修改元数据时,偶尔会导致COM错误。
错误消息基本上表示该文件已被另一个线程修改。当自定义功能正在更改元数据时,似乎ItemAdded事件仍在将文件写回数据库。我已经尝试输入延迟和错误捕获循环来尝试检测SPListItem是否可以安全修改但收效甚微。
有没有办法判断另一个线程是否锁定了文档?
答案 0 :(得分:1)
有时候我会看到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);
}
}
答案 1 :(得分:0)
我将不得不调查并回复你。我的问题似乎是,在不同的类中运行代码,在不同的功能中,由不同的线程控制,所有这些代码都试图访问相同的记录。
我试图避免使用固定延迟。对于任何线程问题,存在一个线程可能延迟或阻止超出我们预期的病态可能性。通过在具有不同负载的不同服务器硬件上进行部署,这是非常现实的可能性。在光谱的另一端,即使我要延迟,我也不希望它非常高,特别是30秒。我的客户将导入数以万计的文件,任何长度的延迟都会导致导入整天占用。