我经常使用SQL服务器从asp.net站点向第三方会计系统发送数据。数据导入通常需要一段时间,我正在尝试找到最好的方法来处理长时间运行的任务,如果他们想要了解它是如何做的,就能更新用户。我的问题是下面的方法有哪些优缺点,你推荐什么,为什么?
旧式asp response.write:我实际上使用了这个,现在是我去方法,因为它很快。我真的没有太多问题。我认为应用程序池回收将是一个问题,但我不认为它会在请求过程中回收。
使用类似于此处提出的IFrame http://encosia.com/easy-incremental-status-updates-for-long-requests/:与上述方法类似,但这是异步的。我不确定这是否允许重新启动asp.net < / p>
一个单独的Windows应用程序,它从站点调用Web服务:我使用了这种方法,但设置时间稍长,并且当应用程序池回收时将停止运行。我可能不会使用这种方法
Windows工作流程:没有使用它,但似乎(特别是对于小数据更新)会有点矫枉过正
Windows服务:与上述相同。似乎太难了
Ajax,单独的线程和计时器来轮询缓存的结果:我已经使用了这一点但是如果应用程序池在一个asp.net不知道的单独线程上进行回收,这将停止的。
答案 0 :(得分:1)
如果作业花费的时间超过几分钟,我建议将作业添加到数据库中,在该数据库中,作业的状态可以由执行工作的过程更新。您可以实现一个小型命令行应用程序或Windows服务(它们真的不是很糟糕,请参阅Writing a Useful Windows Service in .NET in Five Minutes)来监视数据库中的新作业。当它找到一个时,它会捡起它并随着它的变化更新它的状态。最终用户可以重定向到列出每个作业及其进度的页面。作业完成后,数据库行将更新,应用程序将等待新作业出现。
答案 1 :(得分:0)
这真的是一个问题,即您希望执行的后台任务有多重要,以及触发它的原因。 如果它是在每个已知间隔内发生的循环事件,我发现在应用程序线程(global.asax)上创建一个Timer最好,如下例所示:
在ASP.NET中实现重复的后台任务 - http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
为了覆盖客户端,iframe可以做到这一点,但Ajax请求会更优雅。
只要您在HostingEnvironment.RegisterObject上签署任务,池回收就不会侵入您的工作。