【问题标题】:How to access the SPSite object from a separate thread in Sharepoint 2010 Sandbox如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象
【发布时间】:2012-04-25 10:28:15
【问题描述】:

我想做的是创建一个在事件接收器FeatureActivated 上启用的计时器。我想使用此计时器每天执行一次,以检查列表中的某些项目并更新这些项目的状态。

我可以创建和启用计时器 - 没问题。但是当我尝试访问 SPSite 对象以获取列表项时,我收到以下错误:

共享点子集 OM 已为当前线程禁用。

计时器在导致问题的单独线程中运行。

我的问题是:如何访问 SPSite 对象以从单独的线程访问列表项?

注意:我正在使用计时器,因为我无法在沙盒解决方案中使用计时器作业。谢谢。

【问题讨论】:

  • 你说的定时器是什么意思? Threading.TimerTimers.Timer 之类的类的实例?
  • 您使用什么代码来获取 SPSite 对象以及您的网站集 URL 是什么?
  • 是 Timers.Timer 类的实例。我这样创建 SPSite 对象:using (SPSite siteCollection = new SPSite("http://localhost:1548")) { web = siteCollection.OpenWeb(); SPListItemCollection listItems = myWeb.Lists["Configuration"].Items; }

标签: multithreading sharepoint sandbox


【解决方案1】:

恐怕您在后台运行任务的方法是不可能的。我可以确认您无法在异步委托中访问 SP OM 或在单独的线程上运行。我猜这是因为沙盒解决方案中的资源使用受到监控和限制。例如,您不得在未处置的情况下留下物品。

不仅不允许您使用stringGuid 创建SPSite 对象;您也不能将事件接收器中可用的 (SPSite)properties.Feature.Parent 对象传递给委托。 (对象的所有属性都会抛出相同的异常。)

一般来说,我认为您的解决方案太脆弱了。在传统的解决方案中,您的代码将在w3wp.exe 进程中运行,并且在激活您的功能后第一个应用程序池回收将终止计时器(整个应用程序域)。同样,在沙盒解决方案中,您将受到SPUCWorkerProcess.exe 的摆布。您需要一些能够每天可靠地执行您的代码的服务主机。

沙盒解决方案和/或 SharePoint Online 不提供后台运行服务的功能。您必须在其他地方运行您的代码,例如:

  1. 如果允许您至少部署一个小型场解决方案,则可以将列表项更新代码部署为 SP 计时器作业。

  2. 如果您有能力一直运行 Windows 计算机,则可以使用 SP 客户端 OM 编写列表项刷新代码,并将其安装为 Windows Service (timer loop)Windows Scheduled Task (timed start)。 (后者更简单。)

  3. 如果您的解决方案应该在 SharePoint Online 中运行并且您不能依赖本地 Windows 计算机,则可以将其部署为 hosted service (Worker Role) in Microsoft Azure

  4. 您可以实现定期更新功能,以便在沙盒解决方案中按需运行 - 例如,作为 ASPX 页面。然后,您将通过pinglerwebcron 等公共服务触发执行代码的资源的URL。

实际上,选项 1 - 3 可以按照与选项 4 相同的方式编写 - 在沙盒解决方案中定期执行的代码和触发代码(非常短且独立于 SP)根据调度程序的性质分开 - 它甚至可以是使用 cron 调度的 LWP 的 perl 脚本。

--- 费达

【讨论】:

  • 感谢您的回答。我正在开发的解决方案必须创建为沙盒解决方案,并且必须在 Sharepoint Online 上运行,安装后我将无法访问任何数据。
猜你喜欢
  • 2012-05-08
  • 2011-10-08
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多