使用 C# 创建 gRPC 服务器。 Return 类型任务?
Creating gRPC server with c#. Return types Task?
我用 C# 创建了一个 gRPC 服务器。非常简单。
令我困惑的是,所有消息请求的 return 类型都是 Tasks
.
来自示例问候语服务器:
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
我想知道为什么 return 类型不只是 HelloReply
。我开始创建自己的服务器并继续 returning Task.FromResult
但实际上这不是 Task 的使用方式。所以我担心我遗漏了一些东西(关于性能?)。但另一方面,我无法想象可能有什么问题。 gRPC 服务器对于每个请求都是并行的,不是吗?
那么 returning Task 在什么情况下有用?
并发(并行)不同于异步(任务等);使用阻塞(非异步)调用意味着在您的操作期间,一个线程专用于您的操作,考虑到大多数 real 服务涉及外部,这不是很大的可扩展性IO(数据库、文件等)- 正是 这里 异步带来了巨大的好处。线程是昂贵且有限的——这强加了人为的吞吐量限制,这可以通过异步来避免。返回诸如 Task<HelloReply>
或 ValueTask<HelloReply>
之类的东西是 允许 (但不要求)异步的先决条件。
如果您不需要它(这似乎不太可能):请像您一样使用 Task.FromResult
。或者,如果您使用的是 protobuf-net.Grpc:直接支持同步方法(它基本上与您的操作方式非常相似)。
我用 C# 创建了一个 gRPC 服务器。非常简单。
令我困惑的是,所有消息请求的 return 类型都是 Tasks
.
来自示例问候语服务器:
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
我想知道为什么 return 类型不只是 HelloReply
。我开始创建自己的服务器并继续 returning Task.FromResult
但实际上这不是 Task 的使用方式。所以我担心我遗漏了一些东西(关于性能?)。但另一方面,我无法想象可能有什么问题。 gRPC 服务器对于每个请求都是并行的,不是吗?
那么 returning Task 在什么情况下有用?
并发(并行)不同于异步(任务等);使用阻塞(非异步)调用意味着在您的操作期间,一个线程专用于您的操作,考虑到大多数 real 服务涉及外部,这不是很大的可扩展性IO(数据库、文件等)- 正是 这里 异步带来了巨大的好处。线程是昂贵且有限的——这强加了人为的吞吐量限制,这可以通过异步来避免。返回诸如 Task<HelloReply>
或 ValueTask<HelloReply>
之类的东西是 允许 (但不要求)异步的先决条件。
如果您不需要它(这似乎不太可能):请像您一样使用 Task.FromResult
。或者,如果您使用的是 protobuf-net.Grpc:直接支持同步方法(它基本上与您的操作方式非常相似)。