[英]Is using aync/await a good idea for web services?
我有很多Web服務,當它們被調用時,它們需要在返回之前調用其他外部服務來獲取信息。 這一切都是同步完成的。
因此,如果我有一個返回電影列表的電影GET服務,Web服務邏輯將等待電影提供商的外部服務返回數據,處理它並返回GET的數據。
將外部服務調用包裝在Task中並使用async / await模型可以證明它有什么好處嗎? 處理GET的初始線程是否仍然只是被阻塞等待響應,還是會被釋放來處理其他傳入的服務調用?
將外部服務調用包裝在Task中並使用async / await模型可以證明它有什么好處嗎?
包裝同步調用可能不會帶來太多好處 - 但如果外部服務提供真正的異步API,您可以獲得顯着的好處。
處理GET的初始線程是否仍然只是被阻塞等待響應,還是會被釋放來處理其他傳入的服務調用?
我不知道WCF目前對async的支持是什么樣的,但是應該可以編寫所有這些內容,以便在實際工作完成時只有任何線程處於活動狀態...所以你可以處理數百個只有幾個線程的請求。 如果您的任何外部服務調用相對較慢,這一點尤為重要。
所以基本上, 有要取得收益,但你應該考慮兩個方面分開:
這些方面中的每一個都可以帶來好處,但如果兩個方面都得到完全支持,您將獲得最大的好處 - 最終得到最簡單的代碼。
將外部服務調用包裝在Task中並使用async / await模型可以證明它有什么好處嗎?
是的,假設您的API已經異步,例如,您可以輕松地將WebClient
更改為HttpClient
(或異步使用WebClient
),或者您可以將Begin
/ End
方法包裝到Task
。
什么你不想做的就是換一個同步方法到Task.Run
。 這將耗盡一個線程,你將失去你的可擴展性。
處理GET的初始線程是否仍然只是被阻塞等待響應,還是會被釋放來處理其他傳入的服務調用?
初始線程將被釋放以處理其他請求。
我有很多Web服務,當它們被調用時,它們需要在返回之前調用其他外部服務來獲取信息。
這是async
/ await
的理想情況,因為您經常可以同時執行請求:
public async Task<MyResult> GetAsync()
{
// Start several external requests simultaneously.
Task<Movie> getMovieTask = GetMovieAsync(...);
Task<Genre> getGenreTask = GetGenreAsync(...);
...
// Asynchronously wait for them all to complete.
await Task.WhenAll(getMovieTask, getGenreTask, ...);
var movie = await getMovieTask;
var genre = await getGenreTask;
...
// Build the result.
return ...;
}
在這種情況下,您可以在飛行中對外部服務發出多個請求,當您處於await Task.WhenAll
行時,您的請求不會使用任何線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.