C # 8 асинхронных потоков против REST / RPC - PullRequest
2 голосов
/ 16 октября 2019

Я уверен, что этот вопрос докажет мое невежество, но мне трудно понять это. Я хочу задать тупой вопрос, чтобы получить хороший ответ.

Все посты, которые я читал об асинхронных потоках, хорошо демонстрируют эту функцию, но они не объясняют, почему это улучшение по сравнению с альтернативой.

Или, может быть, когда следует использовать асинхронные потоки по старой доброй клиент-серверной связи?

Я могу видеть, где потоковая передача содержимого большого файла может быть полезна для асинхронных потоков, но во многих примерах, которые я видел, используются асинхронные потоки для передачи небольших бит данных датчика (например, температуры). ). Кажется, что IoT-устройство с датчиком температуры может просто HTTP POST данные на сервер, и сервер может ответить. Почему сервер реализует асинхронные потоки в этом случае?

Я уже чувствую вашу боль, когда вы пытаетесь понять смысл этих слов, но, пожалуйста, помилуйте меня. :)

По просьбе, вот несколько примеров, с которыми я столкнулся, которые смутили меняЯ опубликую больше, как только найду их, но я хотел бы начать и начать:

1 Ответ

3 голосов
/ 16 октября 2019

Я хотел написать профессиональный ответ, но, вероятно, тоже нужен грубый:

Забудьте, что вы когда-либо слышали о async streams. О чем они думали?

Назовите это await foreach или async enumerables или async iterators. Это не имеет ничего общего с IO и потоками.

Этот термин используется потому, что он существует на других языках, а не потому, что он имеет какое-либо отношение к IO. Например, в Java потоки являются реализацией Java в C # IEnumerable. Итак, чтобы облегчить принятие будущими разработчиками Android, C # принял плохую идею Java.

Мы можем взглянуть на собрания по разработке языка для реального обоснования этого термина, я думаю.


Серьезный оригинальный ответ

Там нет vs. Это как контрастирование автоматических коробок передач и автомобилей. Автомобили могут иметь автоматические коробки передач, они не используются вместо коробок передач.

Асинхронные потоки - это чисто программная концепция, позволяющая создавать асинхронные итерации. Это функция, которая позволяет нам писать это для выполнения HTTP-вызовов в цикле и обработки результатов по мере их поступления:

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 Core тольконачать обработку результатов по мере их появления, они не влияют на содержимое самого HTTP-ответа.

потоки gRPC , с другой стороны, позволяют серверу асинхронно отправлять индивидуальные ответы клиенту. Лоран Кемпе в gRPC и C # 8 Асинхронный поток и Стив Гордон в Потоковая передача с использованием GRPC и .NET Core показывают, как их можно использовать вместе

Копирование со Стива ГордонаНапример, у нас есть метеорологическая служба, которая отправляет прогнозы клиенту, , чей прото-файл содержит:

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, клиент будет иметьна блок до получения всех ответов перед их обработкой:

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 ответы могут быть получены и обработаны по мере их поступления:

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
}

**

...