2

很多时候,我必须使用 SQL 服务器从 asp.net 站点向第三方会计系统发送数据或从第三方会计系统发送数据。数据导入通常需要一段时间,我正在尝试找到处理长时间运行任务的最佳方法,如果他们想了解它的运行情况,可以更新用户。我的问题是以下方法的优缺点是什么,您推荐什么,为什么?

  • 旧式asp response.write:我实际上使用了很多,目前是我的首选方法,因为它很快。我真的没有很多问题。我认为应用程序池回收将是一个问题,但我认为它不会在请求中间进行回收。

  • 使用此处建议的 IFrame http://encosia.com/easy-incremental-status-updates-for-long-requests/与上述方法类似,但这是异步的。我不确定这是否允许 asp .net 重启

  • 一个从站点调用 Web 服务的单独 Windows 应用程序:我使用过这种方法,但是设置时间会更长一些,并且会在应用程序池回收时停止运行。我可能不会使用这种方法

  • Windows 工作流程:没有使用过,但似乎(特别是对于小数据更新)会过大

  • Windows 服务:同上。好像太难了

  • Ajax,用于轮询缓存结果的单独线程和计时器:我也使用过很多次,但如果应用程序池回收,这将停止,因为它位于 asp.net 不知道的单独线程上。

4

2 回答 2

1

如果作业花费的时间超过几分钟,我建议将作业添加到数据库中,在该数据库中,作业的状态可以通过执行工作的进程进行更新。您可以实现一个小型命令行应用程序或 Windows 服务(它们确实不错,请参阅用 .NET 在五分钟内编写有用的 Windows 服务)来监视数据库中的新作业。当它找到一个时,它会拿起它并随时更新其状态。最终用户可以被重定向到列出每个作业及其进度的页面。当作业完成时,数据库行被更新并且应用程序等待新作业的出现。

于 2012-06-04T16:13:43.210 回答
0

这实际上是一个问题,即您希望执行的后台任务有多重要以及触发它的原因。如果它是在每个已知间隔内发生的经常性事件,我发现在应用程序线程(global.asax)上创建一个计时器最好像下面的例子:

在 ASP.NET 中实现重复的后台任务 - http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

为了覆盖客户端,iframe 可以解决问题,但 Ajax 请求会更优雅一些。

只要您在 HostingEnvironment.RegisterObject 上签署您的任务,池回收就不会干扰您的工作。

于 2012-06-04T14:00:16.170 回答