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

标签 c# asynchronous task-parallel-library grpc

在 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,只需访问适当的属性(例如 ResponseHeadersAsyncResponseAsync )。

如果你有一个变量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/

相关文章:

c# - 在开始新任务之前检查任务是否已经在运行

c# - 我被 async/await 宠坏了!现在正在为明确的任务延续而苦苦挣扎

c# - 选择所有复选框 WPF

c# - WPF RadioButton InverseBooleanConverter 不工作

c# - 指定 Windows 服务中 AppDomain 的生命周期

javascript - 在 JavaScript 中创建一系列基于控制台文本的输入?

javascript - 异步 Google Analytics 何时以及如何执行?

c# - EntityFramework Core - 复制实体并将其放回数据库

javascript - 如何使用一系列异步请求的结果填充数组

c# - 在 .NET 中与 TPL 并发。 Parallel Generator 在一段时间后阻塞并卡住