【问题标题】:Update progress bar from codebehind从代码隐藏更新进度条
【发布时间】:2012-11-14 11:15:31
【问题描述】:

我的一个网页上有一个很长的submit()-type 函数,它完全在服务器上运行,我想向客户端显示一个进度条来显示进度。

只要我可以向他们展示一些东西,我可以每隔 20% 更新一次。

这甚至可能吗?或许可以通过runat="server" 进行某种控制?我有点迷失在这里的想法。

【问题讨论】:

  • 可能,是的,很简单。这比在基于桌面的环境中要困难得多。
  • @Servy 我想通了。知道一个好的起点吗?
  • 目前我能想到的唯一方法是您的长提交方法必须转换为 ajax 调用。然后你会有另一个 ajax 调用来 ping 服务器并在进程进行时返回完成百分比,然后更新页面上你想要的任何控件。
  • @DaveZych 我一开始也是这么想的,可惜方法很依赖session(别看我,不是我写的:P)
  • 我刚刚写完一个答案。简而言之,你们都是对的。您需要做很多客户端轮询服务器,并将进度存储在某种服务器端状态(即会话)中。

标签: c# asp.net progress-bar


【解决方案1】:

可能,但在基于 Web 的环境中比在基于桌面的环境中更难做到。

您要做的就是向服务器提交请求,让服务器启动异步任务,然后将响应发送回客户端。然后,客户端将需要定期轮询服务器(可能/理想情况下使用 AJAX)以获取更新。服务器将希望在长时间运行的任务主体中设置一个 Session 值(或使用其他存储状态的方法),客户端的轮询方法可以访问该值。

这很讨厌、混乱、效率低下,所以如果有很多用户执行此操作,您不会希望这样做。

Here 是 Microsoft 的一个示例实现。请注意,此示例使用UpdatePanel 对象、ASP 计时器等,这使代码编写起来相当简单(而且仍然不是那么漂亮),但这些组件相当“繁重”。使用显式 AJAX 调用、创建 web 方法而不是执行完整的回发等将大大提高性能。正如我所说,即使在最好的情况下,这也是一场性能噩梦。如果您有很多用户或者这是一个执行非常频繁的操作,请不要这样做。如果它只是供一小部分管理员用户偶尔使用,那么这可能不是问题,从用户的角度来看,它确实增加了很多。

【讨论】:

  • 我可以从 ajax 线程访问会话吗?我没有尝试过,但它似乎是在不同的环境中
  • 是的,你可以。 System.HttpContext.Current.Session
  • 在 ASP.NET 应用程序中处理 ajax 请求在访问 HttpContext、Session 等方面与页面请求没有什么不同。但是,后台线程将无法访问 Session,因此存储进度计数器in Session 是不可能的,但是这个答案很好地描述了 ASP.NET 中进度指示器的一般概念。
【解决方案2】:

我会看看 .net 4.5 的异步和等待。

Using Asynchronous Methods in ASP.NET MVC 4 -- (MVC 例子我知道对不起)

Then check out this example using a progress bar

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多