2015-11-13 116 views
1

我有一個ASP.Net Web窗體應用程序,通過Ajax更新面板中的按鈕單擊事件調用託管在IIS上的WCF服務。 當我點擊按鈕時,我調用一個可能需要1分鐘才能返回的WCF異步進程。我注意到任務正在運行時,我在瀏覽器中打開另一個選項卡,網頁凍結/時鐘,直到長時間運行的任務返回。我假設第一項任務是鎖定UI線程,導致其他人使用該網頁必須等待。ASP.Net異步阻塞UI

如何運行任務,更新UI的結果並且不阻止其他選項卡/用戶的UI?

這裏是一個代碼snipit:

protected void btnsearch_ServerClick(object sender, EventArgs e) 
    { 

     Page.RegisterAsyncTask(new PageAsyncTask(async() => 
     { 
      DataSet ds; 
      ds = await data.GetReportAsync(); 

      grdsummary.DataSource = ds.Tables[0]; 
      grdsummary.DataBind(); 
     })); 

    } 

我也嘗試添加.ConfigureAwait(假)的異步調用,但沒有做任何事情。

回答

0

註冊是一回事,執行是彼此:)

後,只需添加一個ExecuteRegisteredAsyncTasks調用,它應該正常工作,或請加這個地方調用完成的代碼。

protected void btnSearch_Click(object sender, EventArgs e) 
{ 
    Page.RegisterAsyncTask(new PageAsyncTask(async() => 
    { 
     grdsummary.DataSource = await getSomeDataAsync(); 
     grdsummary.DataBind(); 
    })); 
    Page.ExecuteRegisteredAsyncTasks(); 
} 
+0

似乎仍然凍結,直到客場返回。如果我正在等待grdsummary.DataSource = await getSomeDataAsync();這並不意味着Page.ExecuteRegisteredAsyncTasks();直到返回後纔會被解僱? –

+0

我確實看到註冊代碼在預渲染之前不會觸發。我按照建議添加了這段代碼,但仍然有一個頁面不會讓另一個頁面繼續,直到第一個查詢完成。我會認爲異步不會阻止用戶界面 –

2

我認爲首要任務是鎖定在UI線程導致他人使用的網頁,必須等待。

這是ASP.NET;沒有UI線程。

最有可能的情況是,session state正在阻止多個同時發生的請求。

請注意,多個用戶不會受到影響;只有在同一會話中的多個請求將被選擇性化。

+1

我已經在IE和Firefox的同時嘗試了這一點。如果IE正在運行報告,那麼我會去Firefox並點擊任何等待IE瀏覽器返回的鏈接。 –