2014-11-22 41 views
0

我對ASP.NET很新,但對WPF有很好的理解,所以我希望這會有所幫助,但我想不是。在ASP.NET中我需要更新控件,運行任務,然後再次更新控件

我想,如標題所示,更新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

經典的ASP確實讓事情混淆了IMO。 ASP.NET MVC對於實際的HTTP生命週期更加真實。 HTTP實際發生的事情是,客戶端(瀏覽器)向服務器發送一個HTTP請求,然後構建一個HTTP響應來發回。在網頁請求的情況下,該HTTP響應包括所有的HTML。因此,您的處理程序在服務器端「構建」HTML所做的所有工作全部完成之前,響應發送。在處理程序完成之前,什麼都不能發送到客戶端。 Await不會幫助你的情況。 (順便說一下:Await在服務器端肯定很有用;它有助於擴展性,Await會將請求線程返回給線程池;它不會產生到客戶端瀏覽器的所有路徑)。

在您的情況下使用更合適的技術是SignalR,它支持雙向通信的持續連接。

欲瞭解更多信息,請參閱我的博客文章如何async doesn't change the HTTP protocol,或我的recent MSDN article on async ASP.NET

+2

斯蒂芬,他沒有使用經典ASP,儘管標籤。 – 2014-11-22 22:50:27

+0

@Stephen:你確定「在處理程序完成之前什麼都不能發送」?如何創建部分響應http://www.codeproject.com/Articles/388028/ASP-NET-page-partial-rendering – 2014-11-22 23:00:21

+0

@WiktorZychla:的確,您可以刷新部分響應或流式響應。但是,您無法發送整個HTML頁面,然後更改發送的HTML。 – 2014-11-22 23:08:38

0

不確定這是否是一個選項 - 取決於你在哪裏(真的)想要異步,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) { 
      //.... 
     }); 
}); 

web窗體 「代碼隱藏」(代表「 foo.aspx「),使用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; 
    } 

您應該看到在5秒後瀏覽器中的文字 「更新」,沒有刷新/回傳:

Initial hello at 11/22/2014 4:40:55 PM...And hello again from WebMethod 11/22/2014 4:41:00 PM

H個...

+0

[WebMethod不推薦使用](http://johnwsaunders3.wordpress.com/2011/12/07/more-reasons-to-not-use-asmx-services-in-new-code/)。 [Web API](http://www.asp.net/web-api)更合適。 – mason 2014-11-23 00:56:25

+0

@mason同意,只是將其視爲OP的問題......另外,上面的服務器端的東西並不是真正的「肉」..它可能是Web API,WCF等等。只是一個「模擬」可以這麼說 :) – EdSF 2014-11-23 01:03:33

相關問題