为什么AsyncUnaryCall <t>和其他不扩展Task <t>?

时间:2019-02-14 06:29:19

标签: c# asynchronous task-parallel-library grpc

在C#中使用gRPC时,异步调用返回AsyncUnaryCall<T>(对于一元调用-当然,其他调用的返回类型也略有不同)。但是,AsyncUnaryCall<T>不会扩展Task<T>。因此,通常用Task<T>做的普通事情不能用AsyncUnaryCall<T>处理。这包括:

  • 指定继续策略(使用ConfigureAwait
  • 使用Task.WhenAnyTask.WhenAll之类的助手

后者正在困扰我,因为我想启动多个gRPC调用并等待它们全部完成。看来我唯一的办法就是写一个小小的助手,等待一个接一个的助手。

为什么AsyncUnaryCall<T>不反映Task<T>中的功能?

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,虽然它是“类似任务的”,但实际上是represents two separate Tasks。如果要使用单个Task as Task s,只需访问适当的属性(例如ResponseHeadersAsyncResponseAsync)。 / p>

如果您的变量themAll的类型为List<AsyncUnaryCall<T>>,那么使用WhenAll / WhenAny很容易:

await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));

如果您有有用的工作,则可以在任何标题到达时进行操作,或者

await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));

如果在完成所有操作之前无法做任何有用的事情。作为两个例子。同样,您可以提取其中一项任务,并在awaitConfigureAwait中使用它(如果需要)。