为asp.net中的慢速页面添加实时进度更新

2024-02-29

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

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

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

有人能帮忙吗?


这种异步执行可能很难实现。我脑海中浮现出一些解决方案:

完全异步,无需 AJAX:

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

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

  4. 服务器返回 GUID 以及“正在工作...”消息
  5. n 秒/毫秒/在此处插入时间跨度后,浏览器再次发布页面,包括“GetStatus”命令和 GUID。
  6. 服务器根据 GUID 检查数据库中的状态标志。
  7. 服务器根据数据库记录返回状态消息(“第 2 步...”、“仍在工作”或任何适当的内容)
  8. 循环执行步骤(5),直到服务器返回的状态表明该过程完成。

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

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

下面是一个使用 lambda 轻松创建线程的示例 http://www.rvenables.com/2009/01/threading-tips-and-tricks/.

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

同步

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

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

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

后台任务

与第一种异步方法类似:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为asp.net中的慢速页面添加实时进度更新 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何配置 IIS 以接受 POST 请求?

    我知道默认情况下 IIS 不接受发布请求 如何更改此设置 有人可以引导我改变这个 一步一步 吗 如果您使用的是 IIS 6 及更低版本 在 IIS 管理屏幕中右键单击您的网站或虚拟目录 去Properties然后去Home Director
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • ASP.NET 中获取当前域的最佳方法是什么?

    我想知道在 ASP NET 中获取当前域的最佳方法是什么 例如 http www domainname com subdir http www domainname com subdir 应该产生http www domainname co
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐