Dotnet Core Asyn coding
阿新 • • 發佈:2020-08-19
非同步程式碼
ASP.NET Core和EF Core的預設使用非同步程式設計。
Web 伺服器的可用執行緒數量有限,在高負載情況下,所有可用執行緒都可能都在使用。 當發生這種情況時,伺服器無法處理新的請求,直到執行緒被釋放。 使用同步程式碼時,許多執行緒可能會被繫結,而實際上它們並沒有做任何工作,因為它們正在等待 I/O 完成。 使用非同步程式碼,當程序正在等待I/O 完成時,其執行緒將被釋放,供伺服器用於處理其他請求。 因此,非同步程式碼可以更有效地使用伺服器資源,並且使伺服器能夠無延遲地處理更多流量。
非同步程式碼在執行時引入了少量的開銷,但是對於低流量情況,效能下降可以忽略不計,而對於高流量情況,潛在的效能提升是巨大的。 在以下程式碼中,async 關鍵字, Task 返回值,await 關鍵字和 ToListAsync 方法共同構成非同步執行程式碼。
public async Task<IActionResult> Index()
{
return View(await _context.Students.ToListAsync());
}
async
關鍵字告訴編譯器為方法體生成回撥函式,並自動建立返回的Task <IActionResult>
物件。- 返回型別
Task<IActionResult>
表示正在進行的工作,其結果型別為IActionResult
。 await
關鍵字告訴編譯器將該方法分為兩部分。 第一部分以非同步啟動的操作結束。 第二部分被放入回撥方法,該操作在操作完成時被呼叫。ToListAsync
是ToList
擴充套件方法的非同步版本。
當您編寫使用實體框架的非同步程式碼時,需要注意的一些事情:
- 只有會引發查詢或將命令傳送到資料庫的語句才需要非同步執行。 這包括例如
ToListAsync
,SingleOrDefaultAsync
和SaveChangesAsync
。 它不應該包括,例如,只是更改IQueryable的語句,類似var students = context.Students.Where(s => s.LastName == "Davolio")
這樣的語句。 - EF上下文不是執行緒安全的:不要嘗試並行執行多個操作。 當您呼叫任何非同步 EF 方法時,請始終使用 await 關鍵字。
- 如果您想利用非同步程式碼的效能優勢,請確保您正在使用的任何庫包(例如用於分頁)也使用非同步,如果他們呼叫任何導致查詢傳送到資料庫的方法。