我正在尝试向我的 c#/asp.net 4.0 应用程序添加一个实时进度报告,以解决加载缓慢的页面。我查看了 UpdatePanel 和 UpdateProgress Ajax 控件,但我认为它们不合适。
基本上,当用户单击按钮时,页面会执行许多任务,我希望用户在每个任务完成时看到更新,而不是在它们全部完成并且页面加载完成时看到报告。
发生的事情的顺序是:
1.用户点击按钮开始
2.调用方法1
3. 当方法 1 完成时,用户会看到“方法 1 已完成”
3.调用方法2
ETC。
有人能帮忙吗?
这种异步执行可能很难实现。我脑海中浮现出一些解决方案:
完全异步,无需 AJAX:
- 使用点击按钮,提交页面。
-
服务器为任务生成 GUID,并在数据库中创建记录。这可能包括:
服务器生成一个线程来处理任务并传入 Guid。
- 服务器返回 GUID 以及“正在工作...”消息
- n 秒/毫秒/在此处插入时间跨度后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
- 服务器根据 GUID 检查数据库中的状态标志。
- 服务器根据数据库记录返回状态消息(“第 2 步...”、“仍在工作”或任何适当的内容)
- 循环执行步骤(5),直到服务器返回的状态表明该过程完成。
在步骤(3)中创建的线程中:
- 线程启动
- 从DB记录中读取当前状态
- 根据该状态执行下一步
- 更新数据库状态以指示它已准备好执行下一步,或设置错误标志。
- 休眠几毫秒以防止阻塞应用程序(可能是不必要的 - 我不确定线程在 IIS 下如何交互)
- 循环到(2),直到一切完成。
- 线程退出。
下面是一个使用 lambda 轻松创建线程的示例 http://www.rvenables.com/2009/01/threading-tips-and-tricks/.
(new Thread(
() => {
DoLongRunningWork();
}
) { Name = "Long Running Work Thread"
,
Priority = ThreadPriority.BelowNormal
}).Start();
同步
更简单,但可能会导致一些性能问题:
- 用户提交“开始”表单。
- 服务器将“正在开始...”写入响应流并刷新该流。我认为这应该将文本返回给客户,但我已经很多年没有尝试过了。
- 服务器执行第一步。
- 服务器将状态写入响应流并刷新。
- 循环至步骤(3)直至完成。
实际上,页面保持连接打开直到任务完成,并且定期刷新输出可以防止客户端超时。这可能会出现超时等问题,并且您的服务器配置(输出缓冲等)可能是一个问题。
后台任务
与第一种异步方法类似:
- 用户点击“开始”
- 服务器向数据库添加一行,用于标识要执行的任务、检索 ID 并将其返回给客户端。
- 创建一个计划任务(脚本、Windows 服务等),该任务轮询表、执行所需的任务并在执行过程中更新状态。
- 客户定期重新发布带有数据库 ID 的表单。服务器根据数据库检查 ID 并返回有关状态的消息(可能包括有关先前步骤的信息,例如执行时间、预计到达时间等)
- 客户端循环到 (4),直到任务完成或出错。
此方法与第一种方法的区别在于线程存在于单独的进程中而不是 IIS 中。
当然,每种方法都有其问题,并且可能有更简单的方法来做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)