簡體   English   中英

是否正在使用aync /等待Web服務的好主意?

[英]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的支持是什么樣的,但是應該可以編寫所有這些內容,以便在實際工作完成時只有任何線程處於活動狀態...所以你可以處理數百個只有幾個線程的請求。 如果您的任何外部服務調用相對較慢,這一點尤為重要。

所以基本上, 要取得收益,但你應該考慮兩個方面分開:

  • 首先是您正在編寫的Web服務類型的異步支持。 你能否在WCF中用異步方法表達你的服務?
  • 您將要撥打的外部服務

這些方面中的每一個都可以帶來好處,但如果兩個方面都得到完全支持,您將獲得最大的好處 - 最終得到最簡單的代碼。

將外部服務調用包裝在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM