C# 为什么';t异步调用<;T>;和其他扩展任务<;T>;?

C# 为什么';t异步调用<;T>;和其他扩展任务<;T>;?,c#,asynchronous,task-parallel-library,grpc,C#,Asynchronous,Task Parallel Library,Grpc,在C#中使用gRPC时,异步调用返回AsyncUnaryCall(当然,对于一元调用,其他调用的返回类型略有不同)。但是,AsyncUnaryCall不扩展Task。因此,通常使用任务执行的常见操作不适用于异步调用。这包括: 指定延续策略(使用ConfigureAwait) 使用诸如Task.WhenAny和Task.WhenAll 后者此刻正咬着我,因为我想启动多个gRPC呼叫,等待它们全部完成。看来我唯一的办法就是写一个小助手,一个接一个地等待 为什么AsyncUnaryCall不镜像T

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

  • 指定延续策略(使用
    ConfigureAwait
  • 使用诸如
    Task.WhenAny
    Task.WhenAll
后者此刻正咬着我,因为我想启动多个gRPC呼叫,等待它们全部完成。看来我唯一的办法就是写一个小助手,一个接一个地等待


为什么
AsyncUnaryCall
不镜像
Task
中的功能?

正如我在一篇评论中所说,虽然它是“类似于任务的”,但实际上它是。如果要将单个
任务作为
任务
s使用,只需访问相应的属性(例如
ResponseHeaderAsync
ResponseAsync

如果您有一个
List
类型的变量
themAll
,那么使用
whalll
/
WhenAny
很容易:

await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));
如果您有有用的工作,可以在任何标题到达时执行,或者

await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));

如果你不能做任何有用的事情,直到他们全部完成。举两个例子。类似地,您可以提取其中一个任务,并在
await
中使用
ConfigureAwait
,如果您想这样做的话。

它为其标题和完整响应公开单独的
Task
(请参见
ResponseAsync
responseHeaderAsync
)。为什么这些还不够?应用wait东西不一定需要Task,类型只需要实现AsyncUnaryCall所实现的waitiable/waitier模式。您可以传入
call.ResponseAsync
。或者,对于几个:
wait Task.WhenAll(calls.Select(x=>x.ResponseAsync))很好,我在探索API时忽略了这一点。谢谢。有一件事我还不清楚,那就是我是否应该为我打的每一个电话取消对
ResponseAsync
的引用,这样我就可以
configureWait(false)