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

时间:2010-06-09 10:15:42

标签: c# sharepoint sharepoint-2007

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

阅读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,并使用一个新的SPSites?

由于

1 个答案:

答案 0 :(得分:4)

在我最终理解了我实际在做什么之后解决了这个问题 - 通过使用例如新的SPSite(web.Site.ID,我实际上正在制作委托,这似乎是在一个新线程,进入web,在原始帖子上

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