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

Why doesn't AsyncUnaryCall<T> and others extend Task<T>?

在 C# 中使用 gRPC 时,异步调用 return AsyncUnaryCall<T>(对于一元调用 - 当然,其他调用的 return 类型略有不同)。但是,AsyncUnaryCall<T> 不会扩展 Task<T>。因此,您通常使用 Task<T> 执行的常见操作不适用于 AsyncUnaryCall<T>。这包括:

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

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

正如我在评论中所说,虽然它是 "Task-like",但实际上是 represents two separate Tasks。如果您想使用个人 Tasks as Tasks,只需访问适当的 属性(例如 ResponseHeadersAsyncResponseAsync).

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

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

如果您有有用的工作可以在 headers 到达时完成,或者

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

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