1

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

  2. 如果您有能力一直运行 Windows 机器,您可以使用 SP Client OM 编写列表项刷新代码,并将其安装为Windows 服务(计时器循环)Windows 计划任务(定时启动)。(后者更简单。)

  3. 如果您的解决方案应该在 SharePoint Online 中运行并且您不能依赖本地 Windows 计算机,您可以将其部署为Microsoft Azure 中的托管服务(工作角色)

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

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

--- 费尔达

于 2012-04-16T20:28:44.227 回答