【问题标题】:Add a realtime progress update to a slow page in asp.net在 asp.net 中向慢速页面添加实时进度更新
【发布时间】:2011-05-03 15:11:09
【问题描述】:

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

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

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

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

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

    完全异步,没有 AJAX:

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

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

    4. 服务器返回 GUID 以及“工作中...”消息
    5. n seconds/milliseconds/insert-time-span-here 后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
    6. 服务器根据 GUID 检查数据库中的状态标志。
    7. 服务器根据 DB 记录返回状态消息(“步骤 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. 服务器将“正在启动...”写入响应流并刷新该流。我认为这应该会将文本返回给客户,但我已经多年没有尝试过了。
    3. 服务器执行第一步。
    4. 服务器将状态写入响应流并刷新。
    5. 循环到步骤 (3) 直到完成。

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

    后台任务

    类似于第一种异步方法:

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

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

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

    【讨论】:

    • 谢谢,我认为没有 AJAX 的完全异步方法是最好的。我之前设置过后台任务,发现它们充其量是不稳定的。
    • 让我知道这是怎么回事 - 我还没有时间查看从页面或控制器创建线程时会发生什么。不过,我已经看到其他对它的引用表明它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多