我正在尝试将实时进度报告添加到我的 c#/asp.net 4.0 应用程序中,以解决加载缓慢的页面。我看过 UpdatePanel 和 UpdateProgress Ajax 控件,但我认为它们不合适。
基本上,当用户单击一个按钮时,页面会执行许多任务,我希望用户在每个任务完成时看到一个更新,而不是在它们全部完成并且页面加载完成时看到一个报告。
发生的顺序是: 1.用户点击按钮开始 2.调用方式一 3. 当方法 1 完成时,用户看到“方法 1 完成” 3.调用方法2 等等
有人可以帮忙吗?
最佳答案
这种异步执行可能很难实现。我想到了一些解决方案:
没有 AJAX 的完全异步:
- 使用点击按钮,提交页面。
服务器为任务生成一个 GUID,并在您的数据库中创建一条记录。这可能包括:
- 向导(ID)
- 状态标志/枚举
- 开始时间。
服务器生成一个线程来处理任务并传入 Guid。
- 服务器返回 GUID 以及“正在工作...”消息
- n 秒/毫秒/insert-time-span-here 后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
- 服务器根据GUID检查数据库中的状态标志。
- 服务器根据数据库记录返回一条状态消息(“第 2 步...”、“仍在工作”或任何合适的内容)
- 循环到第(5)步,直到服务器返回的状态表明该过程已完成。
在第(3)步创建的线程中:
- 线程开始
- 从数据库记录中读取当前状态
- 根据该状态执行下一步
- 更新数据库状态以指示它已准备好执行下一步,或设置错误标志。
- 休眠几毫秒以防止阻塞应用程序(可能是不必要的 - 我不确定线程如何在 IIS 下交互)
- 循环到 (2),直到一切都完成。
- 线程退出。
Here's an example of easily creating a thread with a lambda .
(new Thread(
() => {
DoLongRunningWork();
}
) { Name = "Long Running Work Thread"
,
Priority = ThreadPriority.BelowNormal
}).Start();
同步
更简单,但可能会导致一些性能问题:
- 用户提交“开始”表单。
- 服务器将“Starting...”写入响应流并刷新流。我认为,这应该可以将文本返回给客户,但我已经好多年没有尝试过了。
- 服务器执行第一步。
- 服务器将状态写入响应流并刷新。
- 循环到步骤 (3) 直到完成。
有效地,页面保持连接打开直到任务完成,并定期刷新输出以防止客户端超时。这可能会出现超时等问题,并且您的服务器配置(输出缓冲等)可能是个问题。
后台任务
类似于第一种异步方式:
- 用户点击“开始”
- 服务器在数据库中添加一行,标识要执行的任务,检索 ID,并将其返回给客户端。
- 创建计划任务(脚本、Windows 服务等)以轮询表、执行所需任务并在其进行时更新状态。
- 客户定期重新发布带有 DB ID 的表单。服务器根据数据库检查 ID 并返回有关状态的消息(可能包括有关先前步骤的信息,例如执行时间、ETA 等)
- 客户端循环到 (4),直到任务完成或出错。
这种方法与第一种方法的区别在于线程存在于单独的进程中而不是 IIS 中。
当然,每种方法都有其问题,并且可能有更简单的方法来做到这一点。
关于c# - 向 asp.net 中的缓慢页面添加实时进度更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871646/