.Net Core WebAPI 基於Task的同步&異步編程
await 和 async
異步的實質就是線程的切換(遇到await),同一請求下,異步和同步的執行時間是一樣的,但有人說異步可以提高XXX性能,但具體是什麽性能呢?又說不上來,其實就只提高並發量,並不能提升你應用程序處理的速度
使用異步的目的是用盡量少的線程保證相同的並發量。
線程的總數少了,線程切換消耗的資源就小了,相對來提供給客戶任務的資源就多了,性能就在這裏。
CPU 在大量線程的情況下,20%的時間片在線程切換上,客戶任務有80%的資源使用。
減少了線程數,只有5%的時間片消耗在線程切換,客戶任務有95%的資源使用。
減少不必要的線程等待,原來線程工作50%+等待閑置50%,現在把等待閑置50%省掉,就會提升1倍的性能。
https://www.cnblogs.com/xishuai/p/asp-net-async-await-and-exception-handling.html
在方法定義返回類型的前面增加async關鍵字表示該方法為異步方法。
而返回值必須是void 或者為Task<T>。T為返回值的類型;
在調用被async修飾過的異步方法時可以使用await關鍵字變為同步方法,語法為調用前增加await關鍵字;string result = await loadString();
- 方法名稱一般是Async 結尾。
- 可以包含一個或者多個await表達式。
- 異步方法的參數不能使用ref和out參數。
- 方法頭包含async關鍵字,並且在返回類型之前。
- 除了方法之外, Lambda 表達式和匿名函數也可以作為異步對象。
async void
該方式聲明的方法是無法使用 catch 捕獲異常的,所以以下代碼的 try、catch 並沒什麽卵用。
在 Task 上加上 ConfigureAwait(false),此設置代表當 async 中的異步任務完成後,不讀取當時調用它的原線程的上下文信息,而是在線程池上下文中執行 async 方法的剩余部分。
Task
https://www.cnblogs.com/viter/p/10201228.html
.Net Core WebAPI 基於Task的同步&異步編程