C# 建立 WEB API 預設是用同步的方式
一個 API Request 就用一條 Thread 去處理
如果改成非同步的方式
可以提升 API 的吞吐量


用 JMeter 以 1 秒內丟 20個 Request
以下是兩種方式的結果

同步方式

[HttpGet]
public ActionResult Get()
{
	Console.WriteLine("Get " + DateHelper.TS() + " " + Thread.CurrentThread.GetHashCode());
	WaitMe();
	return "API OK";
}

public void WaitMe()
{
	Thread.Sleep(2000);
	Console.WriteLine("WaitMe " + DateHelper.TS() + " " + Thread.CurrentThread.GetHashCode());
}

一開始建立 8 條 Thread 後
這 8 條 Thread 就重覆使用
在 Get 跟 WaitMe 都是同一條 Thread
執行完成後才釋放資源
接著再處理下一個 Request
導致第 1 個 Request 跟第 20 個 Request 被 API 接收的時間相差到 5 秒

最快及最慢的回應時間相差非常大,平均時間也高達 4.2 秒

非同步方式

[HttpGet]
public async Task> Get()
{
	Console.WriteLine("Get " + DateHelper.TS() + " " + Thread.CurrentThread.GetHashCode());
	await WaitMe();
	return "API OK";
}

public async Task WaitMe()
{
	await Task.Delay(2000);
	Console.WriteLine("WaitMe " + DateHelper.TS() + " " + Thread.CurrentThread.GetHashCode());
}

改成非同步之後,20 個 Request 瞬間就被 API 接收
Thread 之間交替處理 Request
所以資源是有效地被利用
減少互相等待的時間

回應時間相差非常小,快速又穩定


參考資料:
非同步程式設計
[C#]TPL與Async Await的觀念還有使用方式
ASP.NET async 基本心法