在ASP.NET中我需要更新控件,运行任务,然后再次更新控件

时间:2014-11-22 21:18:24

标签: asp.net vb.net asynchronous task async-await

我对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页面中。我错过了什么?

2 个答案:

答案 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个