Pipelines и Channel<T>

dotNET  /  Производительность dotNET  /  Performance

Недавно вышла статья System.IO.Pipelines: High performance IO in .NET. Она про то, как реализовать более наглядную и быструю работу со стримами в .NET Core 2.1.
От слишком краткого пересказа статья многое потеряет — читайте оригинал. Ладно, будем честными — я сегодня подустал, поэтому бегло её прочитал и не очень разбирался :)

Часть кода из статьи:

async Task ProcessLinesAsync(Socket socket) { var pipe = new Pipe(); Task writing = FillPipeAsync(socket, pipe.Writer); Task reading = ReadPipeAsync(pipe.Reader); return Task.WhenAll(reading, writing); } async Task FillPipeAsync(Socket socket, PipeWriter writer) { const int minimumBufferSize = 512; while (true) { // Allocate at least 512 bytes from the PipeWriter Memory memory = writer.GetMemory(minimumBufferSize); try { int bytesRead = await socket.ReceiveAsync(memory, SocketFlags.None); if (bytesRead == 0) { break; } // Tell the PipeWriter how much was read from the Socket writer.Advance(bytesRead); } catch (Exception ex) { LogError(ex); break; }

Channel<T>

Другая интересная фишка — каналы. У тех, кто программировал на Go (Haskell?), наверняка возникает чувство лёгкого дежавю.

К сожалению, официальной документации не особо много, может, допишут. Накопал такие источники:

Если вкратце, это такая легковесная штука для обмена сообщениями между разными потоками. Использует ValueTask<T>. Сам пока не пробовал.

dotNET  /  Производительность dotNET  /  Performance