Я хотел написать профессиональный ответ, но, вероятно, тоже нужен грубый:
Забудьте, что вы когда-либо слышали о 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
}
**