首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 8异步流与REST/RPC

C# 8异步流与REST/RPC
EN

Stack Overflow用户
提问于 2019-10-16 12:02:46
回答 1查看 1.2K关注 0票数 5

我相信这个问题会证明我的无知,但我很难理解这一点。我愿意问一个愚蠢的问题来得到一个好的答案。

我所读到的关于异步流的所有文章都很好地展示了这个特性,但它们并没有解释为什么它是对替代方法的改进。

或者,也许什么时候应该通过良好的老客户端-服务器通信使用异步流?

我可以看到大文件的内容流在哪里可能是异步流的一个很好的用途,但是我看到的许多例子都使用异步流来传输小的传感器数据(例如温度)。看起来,带有温度传感器的IoT设备只需将数据发送到服务器,服务器就可以响应。在这种情况下,服务器为什么要实现异步流?

当你努力理解这些话时,我已经能感受到你的痛苦,但请怜悯我。:)

按照要求,以下是我遇到的一些让我感到困惑的例子。我会在找到他们的时候发更多,但我想让你开始:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 12:41:45

我想写一个专业的答复,但可能也需要粗俗的回答:

我忘了你听说过async streams**. 他们在想什么?**

叫它await foreach,或async enumerablesasync iterators。它与IO和streams无关。

之所以使用这个术语是因为它存在于其他语言中,而不是因为它与IO有任何关系。例如,在Java中,流是C# IEnumerable的Java实现,因此,为了方便将来的Android采用,C#采用了Java的坏主意。

我想,我们可以看看语言设计会议,看看这个词的实际理由。

严肃原创答案

没有vs。这就像对比自动变速箱和汽车。汽车可以有自动变速箱,它们不是用来代替齿轮箱的。

异步流纯粹是一个编程概念,允许创建异步迭代。它允许我们编写这个特性,在循环中进行HTTP调用,并在结果到达时进行处理:

代码语言:javascript
复制
await foreach(var someValue from someAsyncIterator(5))
{
    ...
}

IAsyncEnumerable<string> someAsyncIterator(int max)
{
    for(int i=0;i<max;i++)
    {
        var response=await httpClient.GetStringAsync($"{baseUrl}/{i}");
        yield return response;
    }
}

当它们作为动作结果出现时,只允许ASP.NET核心中间件在生成结果时开始处理结果,它们不会影响HTTP本身的内容。

另一方面,gRPC的streams允许服务器异步地向客户机发送单独的响应。gRPC和C# 8异步流中的Laurent和使用GRPC和.NET核的服务器流中的Steve展示了如何将它们一起使用。

复制Steve的示例,假设我们有一个天气服务,向客户发送天气预报,谁的原始文件包含:

代码语言:javascript
复制
service WeatherForecasts {
  rpc GetWeather (google.protobuf.Empty) returns (WeatherReply);
  rpc GetWeatherStream (google.protobuf.Empty) returns (stream WeatherData);
  rpc GetTownWeatherStream (stream TownWeatherRequest) returns (stream TownWeatherForecast);
}

在C# 8之前,客户必须阻塞,直到它在处理它们之前接收到所有响应:

代码语言:javascript
复制
using var channel = GrpcChannel.ForAddress("https://localhost:5005");
var client = new WeatherForecastsClient(channel);
var reply = await client.GetWeatherAsync(new Empty());
foreach (var forecast in reply.WeatherData)
{
        //Do something with the data
}

然而,在C# 8中,当响应到达时可以接收和处理:

代码语言:javascript
复制
using var replies = client.GetWeatherStream(new Empty(), cancellationToken: cts.Token);

await foreach (var weatherData in replies.ResponseStream.ReadAllAsync(cancellationToken: cts.Token))
{
        //Do something with the data
}

**

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58412850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档