C# 为什么';t异步调用<;T>;和其他扩展任务<;T>;?
在C#中使用gRPC时,异步调用返回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
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)
。