SPRequestContext缓存SPSites导致RPC_E_ATTEMPTED_MULTITHREAD错误的解决方案?

我正在为SharePoint 2007开发一个解决方案,我正在使用SPSecurity.RunWithElevatedPrivileges,传入SystemAccount的UserToken。

看了http://hristopavlov.wordpress.com/2009/01/19/understanding-sharepoint-sprequest/后我终于明白了为什么我得到这些System.Runtime.InteropServices.COMException(0x80010102):试图拨打更多电话单线程模式下的一个线程。 (来自HRESULT的exception: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 } } } 

在使用这种提升的代码的地方出现错误,更常见的是当有更多用户使用这些function时,我猜也许升级的SPSite会被缓存并重用。

有什么方法可以解决这个问题吗? 如果我的理解是正确的,如何让Sharepoint忘记缓存的SPSites,并使用一个新的SPSites?

谢谢

在我终于理解了我在那里做的事情之后解决了它 – 通过使用例如新的SPSite(web.Site.ID,我实际上正在制作委托,这似乎是在新的线程上,进入网络,在原始主题上

所以答案是:在运行委托之前,已经将所需的所有数据(如各种ID,SystemAccount.UserToken等)放入变量中,并且不访问任何具有关联SPRequest的对象(Web,列表,项目,用户…)来自委托内部。 当然,同样适用于委托之外的数据 – 您可以返回Web ID,列表ID和项ID,但最好不要返回SPListItem。