2008-08-22 39 views
1

我正在研究支持在單個操作中導入多個文檔的SharePoint應用程序。我還有一個ItemAdded事件處理程序,用於執行項目元數據的一些基本維護。此事件針對導入的文檔和手動創建的文檔都會觸發。拼圖的最後一部分是我實現的批處理操作功能,用於啓動工作流並更新另一個元數據字段。Sharepoint COMException 0x81020037

我能夠通過提取SPListItem的文件數據導致COMException 0x81020037。該文件只是一個InfoPath表單/ XML文檔。我能夠修改XML併成功將其推回到SPListItem中。當我之後立即啓動自定義功能並修改元數據時,偶爾會導致COM錯誤。

錯誤消息基本上表明該文件已被另一個線程修改。似乎ItemAdded事件仍在將文件寫回數據庫,而自定義功能正在改變元數據。我嘗試過放入延遲和錯誤捕獲循環來嘗試檢測SPListItem是否可以安全地修改,但很少成功。

有沒有辦法判斷另一個線程是否對文檔有鎖定?

回答

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); 
    } 
} 
0

我得考慮這樣做,並送還給你。我的問題似乎是,代碼運行在不同的類中,在不同的功能中,由不同的線程控制,所有這些線程都試圖訪問相同的記錄。

我試圖避免使用固定延遲。對於任何線程問題,存在一個線程可能延遲或阻塞超出我們預期的病態可能性。通過在具有不同負載的不同服務器硬件上進行部署,這是非常現實的可能性。另一方面,即使我拖延下去,我也不希望它很高,特別是不到30秒。我的客戶將導入數萬個文件,並且任何長度的延遲將導致整個導入需要整天進行。