【发布时间】:2019-02-14 06:29:18
【问题描述】:
在 C# 中使用 gRPC 时,异步调用返回 AsyncUnaryCall<T>(对于一元调用 - 当然,其他调用的返回类型略有不同)。但是,AsyncUnaryCall<T> 不会扩展 Task<T>。因此,您通常使用Task<T> 执行的常见操作不适用于AsyncUnaryCall<T>。这包括:
- 指定延续策略(使用
ConfigureAwait) - 使用像
Task.WhenAny和Task.WhenAll这样的助手
后者现在对我很不利,因为我想启动多个 gRPC 调用并等待它们全部完成。看来我唯一的办法就是写一个小助手,一个接一个地等待。
为什么AsyncUnaryCall<T> 不反映Task<T> 中的功能?
【问题讨论】:
-
它looks like 它公开了单独的
Tasks 的标题和完整的响应(请参阅ResponseAsync和ResponseHeadersAsync)。为什么这些还不够? -
你不一定需要Task来应用await的东西,该类型只需要实现AsyncUnaryCall所做的awaitable/awaiter模式。
-
你可以传入
call.ResponseAsync。或者,对于几个:await Task.WhenAll(calls.Select(x => x.ResponseAsync)); -
很好,不知何故我在探索 API 时错过了这一点。谢谢。
-
我仍然不清楚的一件事是,我是否应该为我拨打的每个电话取消引用
ResponseAsync,以便我可以ConfigureAwait(false)处理它。
标签: c# asynchronous task-parallel-library grpc