2016-12-17 74 views
1

我想在「操作」中使用異步,但當我同時訪問帶有3個選項卡的頁面時,它總是同步。爲什麼總是在異步操作(異步等待)中同步在asp.net mvc中

我發現下一個標籤頁的'startTime'是前一個標籤'endTime'。所以它的同步不是異步。

非常感謝。

public class TestController : Controller 
{ 
    public async Task<string> Index() 
    { 
     return await Task.Run(() => 
     { 
      List<string> lst = new List<string>(); 
      lst.Add(string.Format("startTime:{0}", DateTime.Now.ToString())); 
      var s = new Stopwatch(); 
      s.Start(); 
      System.Threading.Thread.Sleep(10000); 
      s.Stop(); 
      lst.Add(string.Format("endTime:{0}", DateTime.Now.ToString())); 
      lst.Add(string.Format("total:{0}", s.Elapsed.TotalSeconds.ToString())); 
      return string.Join("<br/>", lst.ToArray()); 
     }); 
    } 
} 

enter image description here

+1

您可能會誤解異步控制器的方法。這意味着在長時間運行的任務中,線程返回到線程池,因此可以處理更多的請求(它不會減少該方法執行的時間)。 [ASP.NET中的異步方法](https://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4) –

+0

但ui thead始終等待。直到前一個請求完成。 –

+0

這與使您的方法異步無關。 –

回答

0

實際上卻無關異步/等待你與並行請求執行混淆了。

關於你的問題,我的猜測是,這是由於會話鎖定。 默認情況下,ASP.NET MVC處理程序在每個會話的時間處理一個請求。原因是MVC處理程序假定每個請求會話都可以被修改,並且所有順序請求都需要使用最新的會話值進行處理。您可以輕鬆地在您的控制器設置正確SessionStateBehavior.ReadOnlySessionStateBehavior.Disabled改變這種行爲:

[SessionState(SessionStateBehavior.ReadOnly)] 
public class TestController : Controller 
{ 
    public async Task<string> Index() 
    { 
     return await Task.Run(() => 
     { 
      ... 
     }); 
    } 
} 

通過應用此屬性禁用會話鎖定,並允許多個請求相同的並行會話對象上執行。

+0

我嘗試過,它仍然如此。這是一個由剛剛創建的新的mvc項目。 –