我想要做的是创建一个在事件接收器FeatureActivated
上启用的计时器。我想使用此计时器每天执行一次以检查列表中的某些项目并更新项目的状态。
我可以创建并启用计时器 - 没问题。但是当我尝试访问SPSite对象以获取列表项时,我收到以下错误:
当前线程已禁用sharepoint子集OM。
计时器正在运行它的单独线程,导致问题。
我的问题是:如何访问SPSite对象以从单独的线程访问列表项?
注意:我正在使用计时器,因为我无法在Sandbox解决方案中使用计时器作业。谢谢。
答案 0 :(得分:1)
我担心你无法在后台运行任务。我可以确认您无法在异步委托中访问SP OM或在分离的线程上运行。我想这是因为沙盒解决方案中的资源使用受到监控和限制。例如,您不允许在不处置对象的情况下离开对象。
您不仅不允许使用SPSite
或string
创建Guid
对象;您也无法将事件接收器中可用的(SPSite)properties.Feature.Parent
对象传递给代理。 (对象的所有属性都将抛出相同的异常。)
一般来说,我认为你的解决方案太脆弱了。在传统的解决方案中,您的代码将在w3wp.exe
进程中运行,并且在激活您的功能后第一个应用程序池回收会终止计时器(使用整个应用程序域)。同样,在沙盒解决方案中,您将受SPUCWorkerProcess.exe
的支配。您需要一些能够可靠地每天执行您的代码的服务主机。
沙盒解决方案和/或SharePoint Online不提供后台运行服务的功能。您必须在其他地方运行代码,例如:
如果允许至少部署一个小型服务器场解决方案,则可以将列表项更新代码部署为SP计时器作业。
如果您可以负担得起运行Windows计算机,则可以使用SP Client OM编写列表项刷新代码,并安装为Windows Service (timer loop)或Windows Scheduled Task (timed start)。 (后者更简单。)
如果您的解决方案应该在SharePoint Online中运行,并且您不能依赖本地Windows计算机,则可以将其部署为hosted service (Worker Role) in Microsoft Azure。
您可以实现常规更新功能,以便在沙盒解决方案中按需运行 - 例如,作为ASPX页面。然后,您将触发由pingler或webcron等公共服务执行代码的资源的URL。
实际上,选项1 - 3的编写方式与选项4相同 - 根据调度程序的性质,在沙盒解决方案中定期执行的代码和触发代码(非常短且独立于SP) - 它甚至可以使用由cron安排的LWP的perl脚本。
---费达