【问题标题】:solution for RPC_E_ATTEMPTED_MULTITHREAD error caused by SPRequestContext caching SPSites?SPRequestContext 缓存 SPSites 导致的 RPC_E_ATTEMPTED_MULTITHREAD 错误的解决方案?
【发布时间】:2014-07-04 18:06:21
【问题描述】:

我正在为 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 忘记缓存的 SPSsite,而使用新的?

谢谢

【问题讨论】:

    标签: c# sharepoint sharepoint-2007


    【解决方案1】:

    自己解决了这个问题,在最终了解了我在那里实际做的事情之后 - 通过使用例如 new SPSite(web.Site.ID, 我实际上是在让似乎在一个新线程上的委托进入web,在原始线程上

    所以答案是:在运行委托之前,您已将所需的所有数据(如各种 ID、SystemAccount.UserToken 等)放入变量中,并且不要访问任何具有相关 SPRequest 的对象(网络、列表, items, users...) 来自委托内部。当然,从委托中传出的数据也是如此——您可以返回 Web ID、列表 ID 和项目 ID,但最好不要返回 SPListItem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2010-11-05
      • 2016-04-28
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多