为什么 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>
。这包括:
- 指定延续政策(使用
ConfigureAwait
)
- 使用像
Task.WhenAny
和 Task.WhenAll
这样的助手
后者现在正困扰着我,因为我想启动多个 gRPC 调用并等待它们全部完成。看来我唯一的办法就是写一个一个一个等待的小帮手。
为什么 AsyncUnaryCall<T>
不反映 Task<T>
中的功能?
正如我在评论中所说,虽然它是 "Task-like",但实际上是 represents two separate Task
s。如果您想使用个人 Task
s as Task
s,只需访问适当的 属性(例如 ResponseHeadersAsync
或 ResponseAsync
).
如果您有一个类型为 List<AsyncUnaryCall<T>>
的变量 themAll
,那么使用 WhenAll
/WhenAny
很容易:
await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
如果您有有用的工作可以在 headers 到达时完成,或者
await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));
如果在它们全部完成之前您无法做任何有用的事情。作为两个例子。同样,如果需要,您可以提取其中一项任务并在 await
和 ConfigureAwait
中使用它。
在 C# 中使用 gRPC 时,异步调用 return AsyncUnaryCall<T>
(对于一元调用 - 当然,其他调用的 return 类型略有不同)。但是,AsyncUnaryCall<T>
不会扩展 Task<T>
。因此,您通常使用 Task<T>
执行的常见操作不适用于 AsyncUnaryCall<T>
。这包括:
- 指定延续政策(使用
ConfigureAwait
) - 使用像
Task.WhenAny
和Task.WhenAll
这样的助手
后者现在正困扰着我,因为我想启动多个 gRPC 调用并等待它们全部完成。看来我唯一的办法就是写一个一个一个等待的小帮手。
为什么 AsyncUnaryCall<T>
不反映 Task<T>
中的功能?
正如我在评论中所说,虽然它是 "Task-like",但实际上是 represents two separate Task
s。如果您想使用个人 Task
s as Task
s,只需访问适当的 属性(例如 ResponseHeadersAsync
或 ResponseAsync
).
如果您有一个类型为 List<AsyncUnaryCall<T>>
的变量 themAll
,那么使用 WhenAll
/WhenAny
很容易:
await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
如果您有有用的工作可以在 headers 到达时完成,或者
await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));
如果在它们全部完成之前您无法做任何有用的事情。作为两个例子。同样,如果需要,您可以提取其中一项任务并在 await
和 ConfigureAwait
中使用它。