2010-06-09 79 views
1

我正在開發SharePoint 2007的解決方案,並且我正在使用SPSecurity.RunWithElevatedPrivileges,傳入SystemAccount的UserToken。由SPRequestContext緩存導致的RPC_E_ATTEMPTED_MULTITHREAD錯誤的解決方案SPSites?

閱讀http://hristopavlov.wordpress.com/2009/01/19/understanding-sharepoint-sprequest/後,我終於開始明白,爲什麼我得到這些System.Runtime.InteropServices.COMException(0x80010102):企圖使在單線程模式不止一個線程調用。 (異常來自HRESULT:0x80010102(RPC_E_ATTEMPTED_MULTITHREAD))錯誤,但似乎沒有解決方案 - 「產品中的已知問題」

該文章已超過一年。我無法找到任何更近的有幫助,但我希望也許有其他人?

我的代碼是這樣

SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
    using (SPSite elevatedSite = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken)) 
    { 
     using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID)) 
     { 
     // some operations on lists and items obtained through elevatedWeb 
     } 
    } 
    } 

的錯誤拿出的地方使用這種升高的代碼,而且往往當有誰使用這些功能更多的用戶,所以我想也許是升高的SPSite越來越緩存和重用。

有什麼辦法解決這個問題嗎?如果我的理解是正確的,如何讓Sharepoint忘記緩存的SPSites,並使用新的而不是?

感謝

回答

4

解決它自己後,終於理解什麼我實際上做有 - 例如通過使用新的SPSite(web.Site.ID,實際上我做代表,這似乎是在一個新的線程,到達網絡,這是在原始線程

所以答案是:你已經把所有你需要的數據(如各種ID,SystemAccount.UserToken等)變量變量之前運行委託,並且不會從代理內部訪問任何具有關聯SPRequest的對象(網頁,列表,項目,用戶...),當然,對於從代理中移出的數據也是如此 - 您可以返回Web ID ,列表ID和項目ID,但你是不要返回SPListItem。

相關問題