我对ASP.NET很陌生,但对WPF有很好的理解,所以我希望这会有所帮助,但我猜不是。
我希望,正如标题所说,更新span.innerHTML
然后运行异步任务,再次更新跨度。
我试过这个
Status.InnerText = "Connecting..."
Await Task.Run(Sub() Thread.Sleep(5000)) 'simulating a long running process
Status.InnerText = "Connected"
但它只在任务完成时更新。
我有
<%@ Page Language="vb" Async="true" AsyncTimeout="20"
在我的aspx页面中。我错过了什么?
答案 0 :(得分:0)
经典ASP真的让人困惑,IMO。 ASP.NET MVC对实际的HTTP生命周期更加真实。 HTTP实际发生的是客户端(浏览器)向服务器发送HTTP请求,然后服务器构造单个HTTP响应以发回。对于网页请求,该HTTP响应包括所有HTML。
所以,你的处理程序在服务器端做的所有工作&#34;构建&#34;在发送响应之前,HTML全部完成。在处理程序完成之前,不能向客户端发送任何内容。 Await
在您的情况下无法帮助您。 (顺便说一句:Await
在服务器端肯定是有用的;它有助于扩展性。Await
会将请求线程返回到线程池;它只是不会产生所有方式到客户端浏览器)。
在您的情况下使用的更合适的技术是SignalR,它支持与双向通信的持久连接。
有关详细信息,请参阅我的博客文章,了解async
doesn't change the HTTP protocol或我的recent MSDN article on async
ASP.NET。
答案 1 :(得分:0)
不确定这是否适合您 - 取决于&#34;其中&#34;你(真的)想要异步,Javascript听起来很理想。
琐碎的例子:
给出ASP.Net表格:
<form id="form1" runat="server">
<div>
<asp:Label runat="server" ID="Status" />
</div>
</form>
使用Jquery:
$(function () {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "foo.aspx/HelloWorld",
data: {}
}).done(function (d) {
$("#<%:Status.ClientID%>").append("..." + d.d);
}).fail(function (f) {
//....
}).always(function (a) {
//....
});
});
WebForm&#34;代码隐藏&#34; (对于&#34; foo.aspx&#34;上面),使用WebMethod:
protected void Page_Load(object sender, EventArgs e)
{
Status.Text = "Initial hello at " + DateTime.Now;
}
[WebMethod]
public static string HelloWorld()
{
Thread.Sleep(5000);
return "And hello again from WebMethod " + DateTime.Now;
}
你应该看到文字&#34;更新&#34;在5秒后在浏览器上,没有刷新/回发:
Initial hello at 11/22/2014 4:40:55 PM...And hello again from WebMethod 11/22/2014 4:41:00 PM
... H个