2016-03-15 148 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序列化程序,没有异步反序列化方法,因此异步版本仅包装同步反序列化调用。

这是发生了什么一个简要总结,希望它有助于:)