[英]NEST async call
異步調用的內部結構已經使用基於任務並行庫(TPL)的方法重寫,以使用async / await。 這使得簡化異常和錯誤處理方法變得更容易,盡管舊的TPL和新的異步/等待方法都是異步的(只要異步方法被公開)。
我們以GetAsync<T>()
為例。 通話管道是:
IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
IElasticLowLevelClient.GetAsync<T>()
其中包含從上一次調用中提取的路由值 IElasticLowLevelClient.DoRequestAsync<T>()
,一種調用ITransport
請求異步方法的通用請求調度方法 ITransport.RequestAsync<T>()
,默認的Transport<TConnectionSettings>
將:
IRequestPipeline
使用IRequestPipelineFactory
。 默認值為RequestPipeline
IConnectionPool
支持嗅探,則在第一個池使用時使用RequestPipeline.SniffAsync()
。 在SemaphoreSlim
上執行WaitAsync()
以阻止第一次嗅探發生。 從群集中選擇一個節點,並應用以下調用:
RequestPipeline.SniffOnStaleClusterAsync()
,如果集群已被標記為過時 RequestPipeline.PingAsync()
確保可以ping通節點 使用RequestPipline.CallElasticsearchAsync<TReturn>()
調用Elasticsearch,它將在創建ElasticClient時使用傳遞給ConnectionSettings
的IConnection
以使用IConnection.RequestAsync<TReturn>()
發出請求。 .NET 4.5 +中的默認IConnection
(即全脂 CLR)是HttpConnection
。 在內部, HttpConnection
使用HttpWebRequest
來發出實際請求:
HttpWebRequest.GetRequestStreamAsync()
獲取請求流 PostData<T>.WriteAsync()
將數據寫入請求流 HttpWebRequest.GetResponseAsync()
發出HTTP請求 ResponseBuilder<TReturn>.ToResponseAsync()
從響應流構建有意義的響應。 在這里,響應將被反序列TReturn
; 對於大多數響應是json,這將使用IElasticsearchSerializer.DerserializeAsync<TReturn>()
來反序列化響應。 對於使用Json.NET的默認json序列化程序,沒有異步反序列化方法,因此異步版本只包含同步反序列化調用。 這是對發生的事情的簡要總結,希望它有幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.