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

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

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

有人能帮忙吗?

最佳答案

这种异步执行可能难以实现。我头顶上的一些解决方案:

没有 AJAX 的完全异步:

  • 使用点击按钮,提交页面。
  • 服务器为任务生成一个 GUID,并在您的数据库中创建一个记录。这可能包括:
  • Guid (ID)
  • 状态标志/枚举
  • 开始时间。
  • Server 产生一个线程来处理任务并传入 Guid。
  • 服务器返回 GUID 以及“正在工作...”消息
  • 在 n seconds/milliseconds/insert-time-span-here 之后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
  • 服务器根据 GUID 检查数据库中的状态标志。
  • 服务器根据 DB 记录返回状态消息(“第 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) 直到完成。

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

    后台任务

    类似于第一种异步方法:
  • 用户点击“开始”
  • Server 向 DB 添加一行,用于标识要执行的任务,检索 ID,并将其返回给客户端。
  • 创建一个计划任务(脚本、Windows 服务等),它轮询表、执行所需的任务并随着进度更新状态。
  • 客户端定期重新发布带有 DB ID 的表单。服务器根据 DB 检查 ID 并返回有关状态的消息(可能包括有关先前步骤的信息,例如执行时间、ETA 等)
  • 客户端循环到 (4) 直到任务完成或出错。

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

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

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

    10-11 22:25
    查看更多