3

根据这个链接,NEST 2.0 内部刚刚转移到一个完全成熟的 async/await 实现。

这是否意味着 NEST 2.0 在内部以完全异步的方式工作?

如果不是,我们应该在调用 NEST API 时使用 async 吗?

4

1 回答 1

2

异步调用的内部结构已从使用基于任务并行库 (TPL) 的方法改写为使用 async/await。这使得简化异常和错误处理的方法变得更容易,尽管旧的 TPL 和新的 async/await 方法都是异步的(就异步方法而言)。

让我们GetAsync<T>()举个例子。调用的管道是:

  1. IElasticClient.LowLevelDispatch.GetDispatchAsync<GetResponse<T>>()
  2. IElasticLowLevelClient.GetAsync<T>()使用从上一次调用中提取的路由值
  3. IElasticLowLevelClient.DoRequestAsync<T>(), 一种通用的请求调度方法,它调用ITransport的请求异步方法
  4. ITransport.RequestAsync<T>(),默认情况下Transport<TConnectionSettings>将:

    1. 使用. IRequestPipeline_ IRequestPipelineFactory默认是RequestPipeline
    2. RequestPipeline.SniffAsync()IConnectionPool如果支持嗅探,则在第一次使用池时。WaitAsync()在第一次嗅探发生时,在此处执行ASemaphoreSlim以阻止。
    3. 从集群中选择一个节点并应用以下调用:

      1. RequestPipeline.SniffOnStaleClusterAsync()如果集群之前被标记为过时
      2. RequestPipeline.PingAsync()确保节点可以被ping通
      3. 调用 Elasticsearch,RequestPipline.CallElasticsearchAsync<TReturn>()在创建 ElasticClient 以IConnection使用. .NET 4.5 +(即全脂CLR)中的默认值是. 在内部,用于发出实际请求:ConnectionSettingsIConnection.RequestAsync<TReturn>()IConnectionHttpConnectionHttpConnectionHttpWebRequest

        1. 获取请求流HttpWebRequest.GetRequestStreamAsync()
        2. 如有必要,使用将数据写入请求流PostData<T>.WriteAsync()
        3. 发出 HTTP 请求HttpWebRequest.GetResponseAsync()
        4. 使用响应构建器从响应流构建有意义的响应,ResponseBuilder<TReturn>.ToResponseAsync(). 在这里,响应将被反序列化为TReturn; 对于大多数 json 响应,这将用于IElasticsearchSerializer.DerserializeAsync<TReturn>()反序列化响应。对于使用 Json.NET 的默认 json 序列化程序,没有异步反序列化方法,因此异步版本只是简单地包装了同步反序列化调用。

这是对发生的事情的简要总结,希望对您有所帮助:)

于 2016-03-15T22:57:09.763 回答