c# - 向 asp.net 中的缓慢页面添加实时进度更新

标签 c# asp.net asp.net-ajax

我正在尝试将实时进度报告添加到我的 c#/asp.net 4.0 应用程序中,以解决加载缓慢的页面。我看过 UpdatePanel 和 UpdateProgress Ajax 控件,但我认为它们不合适。

基本上,当用户单击一个按钮时,页面会执行许多任务,我希望用户在每个任务完成时看到一个更新,而不是在它们全部完成并且页面加载完成时看到一个报告。

发生的顺序是: 1.用户点击按钮开始 2.调用方式一 3. 当方法 1 完成时,用户看到“方法 1 完成” 3.调用方法2 等等

有人可以帮忙吗?

最佳答案

这种异步执行可能很难实现。我想到了一些解决方案:

没有 AJAX 的完全异步:

  1. 使用点击按钮,提交页面。
  2. 服务器为任务生成一个 GUID,并在您的数据库中创建一条记录。这可能包括:

    • 向导(ID)
    • 状态标志/枚举
    • 开始时间。
  3. 服务器生成一个线程来处理任务并传入 Guid。

  4. 服务器返回 GUID 以及“正在工作...”消息
  5. n 秒/毫秒/insert-time-span-here 后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
  6. 服务器根据GUID检查数据库中的状态标志。
  7. 服务器根据数据库记录返回一条状态消息(“第 2 步...”、“仍在工作”或任何合适的内容)
  8. 循环到第(5)步,直到服务器返回的状态表明该过程已完成。

在第(3)步创建的线程中:

  1. 线程开始
  2. 从数据库记录中读取当前状态
  3. 根据该状态执行下一步
  4. 更新数据库状态以指示它已准备好执行下一步,或设置错误标志。
  5. 休眠几毫秒以防止阻塞应用程序(可能是不必要的 - 我不确定线程​​如何在 IIS 下交互)
  6. 循环到 (2),直到一切都完成。
  7. 线程退出。

Here's an example of easily creating a thread with a lambda .

(new Thread(
    () => {
        DoLongRunningWork();
    }
) { Name = "Long Running Work Thread"
    ,
    Priority = ThreadPriority.BelowNormal 
    }).Start();

同步

更简单,但可能会导致一些性能问题:

  1. 用户提交“开始”表单。
  2. 服务器将“Starting...”写入响应流并刷新流。我认为,这应该可以将文本返回给客户,但我已经好多年没有尝试过了。
  3. 服务器执行第一步。
  4. 服务器将状态写入响应流并刷新。
  5. 循环到步骤 (3) 直到完成。

有效地,页面保持连接打开直到任务完成,并定期刷新输出以防止客户端超时。这可能会出现超时等问题,并且您的服务器配置(输出缓冲等)可能是个问题。

后台任务

类似于第一种异步方式:

  1. 用户点击“开始”
  2. 服务器在数据库中添加一行,标识要执行的任务,检索 ID,并将其返回给客户端。
  3. 创建计划任务(脚本、Windows 服务等)以轮询表、执行所需任务并在其进行时更新状态。
  4. 客户定期重新发布带有 DB ID 的表单。服务器根据数据库检查 ID 并返回有关状态的消息(可能包括有关先前步骤的信息,例如执行时间、ETA 等)
  5. 客户端循环到 (4),直到任务完成或出错。

这种方法与第一种方法的区别在于线程存在于单独的进程中而不是 IIS 中。

当然,每种方法都有其问题,并且可能有更简单的方法来做到这一点。

关于c# - 向 asp.net 中的缓慢页面添加实时进度更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871646/

相关文章:

c# - ListView 隐藏或折叠选定组

asp.net - HTTP 绝对链接更改为 HTTPS

javascript - ASP.NET Ajax

c# - ASP.NET 集成测试 - TestDrive.net 不会运行它们,其他测试运行者会

c# - 从 Excel 书籍中读取两列到 Dictionary<ID,string>?

c# - UpdatePanel 中 UpdateMethod 后 GridView 的刷新

asp.net-mvc - 表行未使用 MVC Ajax 正确更新

c# - 如何设置代码格式以允许行尾注释?

c# - 我怎么知道没有 Textchanged 事件的文本框的文本更改

c# - 此代码在 Release模式下挂起,但在 Debug模式下工作正常