在 ASP.Net 应用程序中处理长时间运行的进程的最佳方法是什么?
-
09-06-2019 - |
解决方案
为了避免过多的建筑天文学,我经常 使用隐藏的 iframe 调用长时间运行的进程并流回进度信息. 。再加上类似的东西 jsProgressBarHandler, ,您可以很容易地为较长的任务创建出色的带外进度指示,而通用进度动画无法完成它。
在您的特定情况下,您可能希望每个任务使用一次 LongRunningProcess.aspx 调用,以避免页面超时。
例如,调用 LongRunningProcess.aspx?taskID=1 来启动它,然后在该任务结束时发出
document.location = "LongRunningProcess.aspx?taskID=2".
令人作呕。
其他提示
我们遇到了类似的问题,并通过异步 Web 服务调用启动工作(这意味着用户不必等待工作完成)来解决它。然后,Web 服务启动一个 SQL 作业来执行工作并定期更新包含工作状态的表。我们提供了一个允许用户查询表的 UI。
我在上一份工作中遇到了这个问题。我发现的最好方法是启动异步进程,并在完成时通知用户(电子邮件或其他方式)。让他们等待这么长时间将会产生问题,因为超时和浪费了他们的生产力。让他们等待进度条会给他们一种错误的安全感,认为他们可以在关闭浏览器时取消该进程,但情况可能并非如此,具体取决于您设置系统的方式。
- 你如何查询远程数据?
- 多久改变一次?
- 结果是否可以缓存一段时间?
- 我们实际上在这里谈论的时间是多长?
“最佳方法”可能在某种程度上取决于这些问题的答案......
您可以创建另一个线程并在会话或应用程序状态中存储对该线程的引用,具体取决于该线程是每个网站只能运行一次,还是每个用户会话只能运行一次。
然后,您可以将用户重定向到可以监视线程进度的页面。您可以将页面设置为自动刷新,或向用户显示刷新按钮。
线程完成后,您可以向用户发送电子邮件。
我的解决方案是使用带外服务来执行这些操作并将它们缓存在数据库中。
当人们第一次请求某些东西时,他们会等待一段时间,然后它就会出现,但是如果他们刷新,它会立即出现,然后,因为它是 int 他数据库,所以它现在是下一次每小时更新的一部分自上次请求起 24 小时后。
将作业及其相关参数添加到作业队列表中。然后,编写一个 Windows 服务来获取这些作业并对其进行处理,将结果保存到适当的位置,并通过电子邮件向请求者发送结果链接。提供某种用户界面也是一个不错的选择,以便用户可以检查他们的工作状态。
这种方式比启动单独的线程或增加超时要好得多,特别是当您的应用程序较大并且需要扩展时,因为您可以在必要时简单地添加多个服务器来处理作业。