答案 0 :(得分:2)
异步调用的内部结构已经使用基于任务并行库(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
RequestPipeline.SniffAsync()
支持嗅探,则在第一个池使用时IConnectionPool
。 WaitAsync()
执行SemaphoreSlim
此处阻止,同时发生第一次嗅探。从群集中选择一个节点并应用以下调用:
RequestPipeline.SniffOnStaleClusterAsync()
RequestPipeline.PingAsync()
以确保节点可以被ping通使用RequestPipline.CallElasticsearchAsync<TReturn>()
调用Elasticsearch,在创建ElasticClient时使用IConnection
传递给ConnectionSettings
以使用IConnection.RequestAsync<TReturn>()
发出请求。 .NET 4.5 +中的默认IConnection
(即全脂 CLR)为HttpConnection
。在内部,HttpConnection
使用HttpWebRequest
来发出实际请求:
HttpWebRequest.GetRequestStreamAsync()
PostData<T>.WriteAsync()
HttpWebRequest.GetResponseAsync()
ResponseBuilder<TReturn>.ToResponseAsync()
从响应流构建有意义的响应。在此处,响应将被反序列化为TReturn
;对于大多数json响应,这将使用IElasticsearchSerializer.DerserializeAsync<TReturn>()
反序列化响应。对于使用Json.NET的默认json序列化程序,没有异步反序列化方法,因此异步版本只包含同步反序列化调用。这是对发生的事情的简要总结,希望它有所帮助:)