现在的问题是线程问题!
在原始应用程序中,它从数据库中导出某些数据,并显示进度条以指示该过程的进度。
我想将此进度条移植到新的 Web 应用程序中。为此,我考虑使用 AJAX 并使用单独的线程运行数据导出。
主要关注点是:
- 我是否采用了正确的方法?在 Web 应用程序中使用多线程会有什么问题吗?
- 如果在导出过程中按下 F5 或刷新按钮,会发生什么?如何停止这个过程?
- 如何定期更新进度条?我需要通过 ajax 调用服务器吗?
我主要是一个ASP.Net开发人员,但从我所知道的HTTP协议来看,这不是解决问题的方法。我见过很多相当聪明的解决方案,但最终变得清晰的是,HTTP协议根本没有设计成这样工作。
显然,您知道Flash或Silverlight应用程序可以做到这一点,但这也带来了自己的问题。
我个人更喜欢将所有奇怪的东西放在服务器上。过去,我曾经想出一种通过Web应用程序传递数千封电子邮件并更新用户进度的方法。我设计了一组表来充当队列。Web应用程序只需将任何交付请求放入此队列中,进度条将由检查队列中项目状态的请求确定。在后台运行的是一个Windows服务,它也会检查此队列,并实际负责传递邮件并设置每个项目的状态,以便完成或失败。
开发有点困难,因为Windows服务可能会有些棘手,但一旦它开始运行,它就非常平稳和可靠。根据您的情况,也许设置一个简单的定期任务每隔几分钟运行就能解决问题。
在这里找到我的答案
我是否遵循了正确的方法?在Web应用程序中使用多线程会有问题吗?
-是的,您走在了正确的道路上。在Web应用程序中使用多线程没有任何问题,就像在WinForm中一样容易。您将使用AJAX调用而不是使用Dispatcher更新UI,并且通过JavaScript DOM操作进行操作。
如果在导出过程中按下F5或刷新按钮,会发生什么?我该如何停止这个过程?
-不幸的是,没有简单的方法。标准的方法是,在完成此类处理并且用户按下F5时,您将使用JavaScript显示对话框并通知用户作业仍在运行。如果用户仍然想要刷新,则必须向服务器发出另一个请求以取消任务(您需要在某个地方存储线程ID或取消令牌以取消任务)。
如何定期更新进度条?我是否需要通过ajax向服务器发出调用?
-通常的标准方式是显示一个加载图像。如果你想显示一个上下文相关的进度条,那就意味着你需要进行轮询。这里有一个Dino Espito的例子。虽然它是在ASP.NET中,但你可以理解其基本原理。 Dino Espito