在C#中使用gRPC时,异步调用返回AsyncUnaryCall<T>
(对于一元调用-当然,其他调用的返回类型也略有不同)。但是,AsyncUnaryCall<T>
不会扩展Task<T>
。因此,通常用Task<T>
做的普通事情不能用AsyncUnaryCall<T>
处理。这包括:
ConfigureAwait
)Task.WhenAny
和Task.WhenAll
之类的助手后者正在困扰我,因为我想启动多个gRPC调用并等待它们全部完成。看来我唯一的办法就是写一个小小的助手,等待一个接一个的助手。
为什么AsyncUnaryCall<T>
不反映Task<T>
中的功能?
答案 0 :(得分:3)
正如我在评论中所说,虽然它是“类似任务的”,但实际上是represents two separate Task
s。如果要使用单个Task
的 as Task
s,只需访问适当的属性(例如ResponseHeadersAsync
或ResponseAsync
)。 / p>
如果您的变量themAll
的类型为List<AsyncUnaryCall<T>>
,那么使用WhenAll
/ WhenAny
很容易:
await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
如果您有有用的工作,则可以在任何标题到达时进行操作,或者
await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));
如果在完成所有操作之前无法做任何有用的事情。作为两个例子。同样,您可以提取其中一项任务,并在await
和ConfigureAwait
中使用它(如果需要)。