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

me-*_*e-- 4 c# asynchronous task-parallel-library grpc

在 C# 中使用 gRPC 时,异步调用返回AsyncUnaryCall<T>(对于一元调用 - 当然,其他调用的返回类型略有不同)。但是,AsyncUnaryCall<T>不扩展Task<T>。因此,您通常使用 aTask<T>执行的常见操作不适用于AsyncUnaryCall<T>. 这包括:

  • 指定延续策略(使用ConfigureAwait
  • 使用像Task.WhenAny和这样的助手Task.WhenAll

后者目前正在咬我,因为我想启动多个 gRPC 调用并等待它们全部完成。看来我唯一的办法就是写一个小帮手,一个接一个地等待。

为什么不AsyncUnaryCall<T>反映 中的功能Task<T>

Dam*_*ver 6

正如我在评论中所说,虽然它是“类似任务”,但它实际上代表了两个独立的Tasks。如果您想将单个Tasks用作 Tasks,只需访问适当的属性(例如ResponseHeadersAsyncResponseAsync)。

如果你有一个themAll类型的变量,List<AsyncUnaryCall<T>>那么使用WhenAll/WhenAny很容易:

await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
Run Code Online (Sandbox Code Playgroud)

如果你有有用的工作,你可以在任何标题到达时做,或者

await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));
Run Code Online (Sandbox Code Playgroud)

如果在它们全部完成之前你不能做任何有用的事情。作为两个例子。同样,如果您愿意,您可以提取这些任务之一并将其await与 a 一起使用ConfigureAwait