2016-03-15 145 views
3

根據this link,NEST 2.0內部轉移到完全成熟的異步/等待實現。NEST異步調用

這是否意味着NEST 2.0內部以完全異步的方式工作?

如果不是,我們應該在調用NEST API時使用異步嗎?

回答

2

通過使用基於任務並行庫(TPL)的方法來重寫異步調用的內部以使用異步/等待。這使得簡化異常和錯誤處理的方法變得更容易,儘管舊的TPL和新的異步/等待方法都是異步的(就異步方法而言)。

讓我們以GetAsync<T>()爲例。呼叫的管道是:

  1. IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
  2. IElasticLowLevelClient.GetAsync<T>()與路由值從先前的呼叫
  3. IElasticLowLevelClient.DoRequestAsync<T>(),一般的請求調度方法,該方法調用ITransport的請求異步方法
  4. ITransport.RequestAsync<T>()萃取,對於默認的Transport<TConnectionSettings>將會:

    1. 使用IRequestPipelineFactory創建IRequestPipeline。默認值爲RequestPipeline
    2. RequestPipeline.SniffAsync()如果IConnectionPool支持嗅探,則首次使用池。在SemaphoreSlim上執行A WaitAsync()以在第一次嗅探發生時阻塞。
    3. 的節點被從羣集中選擇的與所施加的下列調用:

      1. RequestPipeline.SniffOnStaleClusterAsync()在事件集羣已被標記爲陳舊的先前
      2. RequestPipeline.PingAsync(),以確保節點可以ping
      3. 使用RequestPipline.CallElasticsearchAsync<TReturn>()撥打Elasticsearch的電話,當使用IConnection.RequestAsync<TReturn>()創建ElasticClient以發出請求時,將使用傳遞給ConnectionSettingsIConnection。 .NET 4.5 +中的默認IConnection(即全脂 CLR)爲HttpConnection。在內部,HttpConnection使用HttpWebRequest,使實際的請求:

        1. HttpWebRequest.GetRequestStreamAsync()
        2. 寫入數據,如果必要的請求流獲得請求流使用PostData<T>.WriteAsync()
        3. 使與HttpWebRequest.GetResponseAsync()
        4. 構建一個HTTP請求響應流使用響應構建器的有意義的響應,ResponseBuilder<TReturn>.ToResponseAsync()。在這裏,響應將被反序列化爲TReturn;對於大多數是json的響應,這將使用IElasticsearchSerializer.DerserializeAsync<TReturn>()來反序列化響應。對於使用Json.NET的默認json序列化程序,沒有異步反序列化方法,因此異步版本僅包裝同步反序列化調用。

這是發生了什麼一個簡要總結,希望它有助於:)