根据这个链接,NEST 2.0 内部刚刚转移到一个完全成熟的 async/await 实现。
这是否意味着 NEST 2.0 在内部以完全异步的方式工作?
如果不是,我们应该在调用 NEST API 时使用 async 吗?
根据这个链接,NEST 2.0 内部刚刚转移到一个完全成熟的 async/await 实现。
这是否意味着 NEST 2.0 在内部以完全异步的方式工作?
如果不是,我们应该在调用 NEST API 时使用 async 吗?
异步调用的内部结构已从使用基于任务并行库 (TPL) 的方法改写为使用 async/await。这使得简化异常和错误处理的方法变得更容易,尽管旧的 TPL 和新的 async/await 方法都是异步的(就异步方法而言)。
让我们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()
在第一次嗅探发生时,在此处执行ASemaphoreSlim
以阻止。从集群中选择一个节点并应用以下调用:
RequestPipeline.SniffOnStaleClusterAsync()
如果集群之前被标记为过时RequestPipeline.PingAsync()
确保节点可以被ping通调用 Elasticsearch,RequestPipline.CallElasticsearchAsync<TReturn>()
在创建 ElasticClient 以IConnection
使用. .NET 4.5 +(即全脂CLR)中的默认值是. 在内部,用于发出实际请求:ConnectionSettings
IConnection.RequestAsync<TReturn>()
IConnection
HttpConnection
HttpConnection
HttpWebRequest
HttpWebRequest.GetRequestStreamAsync()
PostData<T>.WriteAsync()
HttpWebRequest.GetResponseAsync()
ResponseBuilder<TReturn>.ToResponseAsync()
. 在这里,响应将被反序列化为TReturn
; 对于大多数 json 响应,这将用于IElasticsearchSerializer.DerserializeAsync<TReturn>()
反序列化响应。对于使用 Json.NET 的默认 json 序列化程序,没有异步反序列化方法,因此异步版本只是简单地包装了同步反序列化调用。这是对发生的事情的简要总结,希望对您有所帮助:)