我在 ASP.NET / C# 中有一个简单的网页。目前,要完全呈现数据,我需要调用在后台线程上运行的代码块,并且可能需要几分钟才能完成。我已经明白了(使用页面声明上的 async 属性)执行并在完成后用 html 正常返回。我想做的是让我立即返回某种“加载页面”,然后在后台工作完成后更新该页面。现在,在处理后台工作时,页面上什么也没有。任何关于最佳方式或聪明方式的想法将不胜感激!
谢谢,
西格
我在 ASP.NET / C# 中有一个简单的网页。目前,要完全呈现数据,我需要调用在后台线程上运行的代码块,并且可能需要几分钟才能完成。我已经明白了(使用页面声明上的 async 属性)执行并在完成后用 html 正常返回。我想做的是让我立即返回某种“加载页面”,然后在后台工作完成后更新该页面。现在,在处理后台工作时,页面上什么也没有。任何关于最佳方式或聪明方式的想法将不胜感激!
谢谢,
西格
我同意上面发表的评论。
但是,我会并且已经使用 ashx(处理程序)将“处理器”实现为单独的页面,因为从 javascript 调用和轮询这些非常简单,您只需将流程请求事件编码到响应流中即可。
我很想在我的网站上向您展示一个示例,但我的主机决定在他们更新服务器上的 .net 时暂停运行我的网站一周(您可以想象我对此并不特别满意)。
本质上,尽管就我而言,我有一个页面依赖于以下数据: bbc google amazon youtube 一些其他随机站点。
页面返回给用户,页面上的各个控件然后将 ajax 调用回服务器以获得它们的部分。
将加载反馈数据的标签的默认内容是一个简单的动画 gif 图像,看起来很像 flash 或 silverlight 加载圆圈。
数据返回后,gif 将替换为服务器提供的内容。
这意味着客户端看到“加载”并且服务器正忙于处理客户端需要的所有内容(从它的角度来看似乎是同步的)。
这是一个干净的用户体验,代码非常简单。
在查看如何使用 silverlight 进行文件上传时,我被这个想法绊倒了。
基本概念:
希望这可以帮助 :)
您想要的称为HTTP Server Push或HTTP Streaming或Long Polling。取决于它是如何完成的。
网上有很多例子,也有深入解释这些问题的文章。我会从研究这些开始。
您还可以在 HTTP Streaming 上查看这个 SO question...
“HTTP Streaming”(推送)AJAX 模式的跨浏览器实现
那里有一个很棒的介绍文章的链接。
或者这个有一个长轮询的例子
或者
https://stackoverflow.com/questions/tagged/long-polling
希望这可以帮助。
有很多方法可以使用Ajax实现您所描述的内容,但是如果您想保持它非常简单,您可以在开始长时间运行的任务之前Flush()
简单地使用一些加载屏幕来响应:
<div>
Loading..
<% Response.Flush(); %>
<% System.Threading.Thread.Sleep(5000); %>
Done!
</div>