gRPC client requires HTTP/2, and HttpClient (the .NET library for making HTTP requests) didn't previously support HTTP/2. The gRPC client actually supports netstandard2.1. Any .NET implementation that supports HTTP/2 should support running the gRPC client.
Kestrel (the .NET web server) already supported HTTP/2 but it required some new features in .NET 3.0 to fully support hosting gRPC services.
Moving data onto and off the network efficiently is (one of) the things that Span<T> was created for.
*) https://devblogs.microsoft.com/dotnet/system-io-pipelines-hi...
Async is not new at all, but classes that really leverage it well might be (pipelines again).
I believe GP is referring to async streams[0]. Notwithstanding the colourful language GP used, I think the new async streams are pretty cool.
[0] https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/gen...
I mean, "slightly more code" - you can say the same about "async ... await" in general, but then it's "insanely more code" and huge potential for error.
It looks that way to me.
i.e. a List<Task<T>> is not the same as an AsyncEnumerable<T>. List<Func<Task<T>>> would be more equivalent, but you needed to have a List<T> which you need to fill beforehand.
You would have to define a few custom types. I have written code that looks something like
while (! ctx.IsCancellationRequested)
{
var data = await source.GetData();
await Process(data);
}
Where source is an interface that we have defined.
This is not much more complex than an async enumerable.It's definitely possible, and if you save an allocation then that's a step up, but not a game changer for most business process.