在 C# 中使用 gRPC 时,异步调用返回 AsyncUnaryCall<T>
(对于一元调用——当然,其他调用的返回类型略有不同)。然而,AsyncUnaryCall<T>
不扩展 Task<T>
.因此,您通常会用 Task<T>
做的常见事情不适用于 AsyncUnaryCall<T>
.这包括:
- 指定延续政策(使用
ConfigureAwait
) - 使用像
Task.WhenAny
这样的助手和Task.WhenAll
后者现在正困扰着我,因为我想启动多个 gRPC 调用并等待它们全部完成。看来我唯一的办法就是写一个一个接一个等待的小 helper 。
为什么不 AsyncUnaryCall<T>
镜像 Task<T>
中的功能?
最佳答案
正如我在评论中所说,虽然它是“类任务”,但实际上是 represents two separate Task
s .如果你想和个人一起工作Task
s 作为 Task
s,只需访问适当的属性(例如 ResponseHeadersAsync
或 ResponseAsync
)。
如果你有一个变量themAll
类型 List<AsyncUnaryCall<T>>
然后使用 WhenAll
/WhenAny
很简单:
await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
如果您有有用的工作可以在任何 header 到达时进行,或者
await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));
如果在它们全部完成之前您不能做任何有用的事情。作为两个例子。同样,您可以提取其中一项任务并在 await
中使用它用ConfigureAwait
,如果你想这样做的话。
关于c# - 为什么 AsyncUnaryCall<T> 和其他人不扩展 Task<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54684416/