System.IO.Pipelines: .NET рдореЗрдВ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди IO

System.IO.Pipelines рдПрдХ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ .NET рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рдВрдЧрдарди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдХреЛрдб рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ рддреЛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред System.IO.Pipelines рдХрд╛ рдХрд╛рд░реНрдп рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА!



Kestrel рдХреЛ рдЙрджреНрдпреЛрдЧ рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП .NET рдХреЛрд░ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реБрдЖред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ Kestrel рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдПрдХ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдПрдкреАрдЖрдИ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 2.1 рдореЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ BCL API (System.IO.Pipelines) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рд╡рд╣ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреА рд╣реИ?


рдХрд┐рд╕реА рд╕реНрдЯреНрд░реАрдо рдпрд╛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдареАрдХ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдорд╛рдирдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдЬ рдХреМрди рд╕реА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЖрддреА рд╣реИрдВ?


рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рдЯреАрд╕реАрдкреА рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд▓рд╛рдЗрди-рд╕реАрдорд╛рдВрдХрд┐рдд рд╕рдВрджреЗрд╢ (\ n) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

NetworkStream рдХреЗ рд╕рд╛рде TCP рд╕рд░реНрд╡рд░


рд╡рд┐рдЪрд▓рди: рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЕрдЧрд░ рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреИрдорд╛рдирд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдпрдорд┐рдд .NET рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

async Task ProcessLinesAsync(NetworkStream stream) { var buffer = new byte[1024]; await stream.ReadAsync(buffer, 0, buffer.Length); // Process a single line from the buffer ProcessLine(buffer); } 

рдирдореВрдирд╛ рджреЗрдЦреЗрдВред github рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдпрд╣ рдХреЛрдб рд╕рдВрднрд╡рддрдГ рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ:

  • ReadAsync рдХреЗ рдПрдХ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд╢рд╛рдпрдж, рдкреВрд░рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рддрдХ)ред
  • рдпрд╣ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред ReadAsync () рд╡рд┐рдзрд┐ - рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдлрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
  • рдХреЛрдб рдПрдХ рдПрдХрд▓ рд░реАрдбрд╛рд╕рд┐рдВрдХ рдХреЙрд▓ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рдирд┐рдкрдЯрддрд╛ рд╣реИред

рдпреЗ рд╕рдмрд╕реЗ рдЖрдо рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдПрд░рд░ рд╣реИрдВред рдЙрдирд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

  • рдирдИ рд▓рд╛рдЗрди рдорд┐рд▓рдиреЗ рддрдХ рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрдлрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдмрдлрд░ рдореЗрдВ рд▓реМрдЯреА рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

  async Task ProcessLinesAsync(NetworkStream stream) { var buffer = new byte[1024]; var bytesBuffered = 0; var bytesConsumed = 0; while (true) { var bytesRead = await stream.ReadAsync(buffer, bytesBuffered, buffer.Length - bytesBuffered); if (bytesRead == 0) { // EOF break; } // Keep track of the amount of buffered bytes bytesBuffered += bytesRead; var linePosition = -1; do { // Look for a EOL in the buffered data linePosition = Array.IndexOf(buffer, (byte)'\n', bytesConsumed, bytesBuffered - bytesConsumed); if (linePosition >= 0) { // Calculate the length of the line based on the offset var lineLength = linePosition - bytesConsumed; // Process the line ProcessLine(buffer, bytesConsumed, lineLength); // Move the bytesConsumed to skip past the line we consumed (including \n) bytesConsumed += lineLength + 1; } } while (linePosition >= 0); } } 

рдирдореВрдирд╛ 2 рджреЗрдЦреЗрдВред рдЬреАрдереВрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ: рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА 1 Kb (1024 рдмрд╛рдЗрдЯреНрд╕) рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рддрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдирдИ рд▓рд╛рдЗрди рдорд┐рд▓рдиреЗ рддрдХ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд▓рдВрдмреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо ArrayPool рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рдмрдлрд╝рд░реНрд╕ рдХреЗ рдкреБрди: рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

  async Task ProcessLinesAsync(NetworkStream stream) { byte[] buffer = ArrayPool<byte>.Shared.Rent(1024); var bytesBuffered = 0; var bytesConsumed = 0; while (true) { // Calculate the amount of bytes remaining in the buffer var bytesRemaining = buffer.Length - bytesBuffered; if (bytesRemaining == 0) { // Double the buffer size and copy the previously buffered data into the new buffer var newBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length * 2); Buffer.BlockCopy(buffer, 0, newBuffer, 0, buffer.Length); // Return the old buffer to the pool ArrayPool<byte>.Shared.Return(buffer); buffer = newBuffer; bytesRemaining = buffer.Length - bytesBuffered; } var bytesRead = await stream.ReadAsync(buffer, bytesBuffered, bytesRemaining); if (bytesRead == 0) { // EOF break; } // Keep track of the amount of buffered bytes bytesBuffered += bytesRead; do { // Look for a EOL in the buffered data linePosition = Array.IndexOf(buffer, (byte)'\n', bytesConsumed, bytesBuffered - bytesConsumed); if (linePosition >= 0) { // Calculate the length of the line based on the offset var lineLength = linePosition - bytesConsumed; // Process the line ProcessLine(buffer, bytesConsumed, lineLength); // Move the bytesConsumed to skip past the line we consumed (including \n) bytesConsumed += lineLength + 1; } } while (linePosition >= 0); } } 

рдирдореВрдирд╛ рджреЗрдЦреЗрдВред рейub рдЬреАрдереВрдм рдкрд░

рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдмрдлрд░ рдЖрдХрд╛рд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВред рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрдлрд░ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрдлрд╝рд░реНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдлрд╝рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ 1 Kb рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЖрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо 1 рдХреЗрдмреА рдХреЗ рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рди рд╣реЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЫреЛрдЯреЗ рдФрд░ рдЫреЛрдЯреЗ рдмрдлрд╝рд░реНрд╕ рдХреЛ рд░реАрдбрд╛рд╕рд┐рдВрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рдПрдЧреАред

рд╣рдо рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рдмрд╛рдЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ 512 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдирдпрд╛ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВрдЧреЗ:

  public class BufferSegment { public byte[] Buffer { get; set; } public int Count { get; set; } public int Remaining => Buffer.Length - Count; } async Task ProcessLinesAsync(NetworkStream stream) { const int minimumBufferSize = 512; var segments = new List<BufferSegment>(); var bytesConsumed = 0; var bytesConsumedBufferIndex = 0; var segment = new BufferSegment { Buffer = ArrayPool<byte>.Shared.Rent(1024) }; segments.Add(segment); while (true) { // Calculate the amount of bytes remaining in the buffer if (segment.Remaining < minimumBufferSize) { // Allocate a new segment segment = new BufferSegment { Buffer = ArrayPool<byte>.Shared.Rent(1024) }; segments.Add(segment); } var bytesRead = await stream.ReadAsync(segment.Buffer, segment.Count, segment.Remaining); if (bytesRead == 0) { break; } // Keep track of the amount of buffered bytes segment.Count += bytesRead; while (true) { // Look for a EOL in the list of segments var (segmentIndex, segmentOffset) = IndexOf(segments, (byte)'\n', bytesConsumedBufferIndex, bytesConsumed); if (segmentIndex >= 0) { // Process the line ProcessLine(segments, segmentIndex, segmentOffset); bytesConsumedBufferIndex = segmentOffset; bytesConsumed = segmentOffset + 1; } else { break; } } // Drop fully consumed segments from the list so we don't look at them again for (var i = bytesConsumedBufferIndex; i >= 0; --i) { var consumedSegment = segments[i]; // Return all segments unless this is the current segment if (consumedSegment != segment) { ArrayPool<byte>.Shared.Return(consumedSegment.Buffer); segments.RemoveAt(i); } } } } (int segmentIndex, int segmentOffest) IndexOf(List<BufferSegment> segments, byte value, int startBufferIndex, int startSegmentOffset) { var first = true; for (var i = startBufferIndex; i < segments.Count; ++i) { var segment = segments[i]; // Start from the correct offset var offset = first ? startSegmentOffset : 0; var index = Array.IndexOf(segment.Buffer, value, offset, segment.Count - offset); if (index >= 0) { // Return the buffer index and the index within that segment where EOL was found return (i, index); } first = false; } return (-1, -1); } 

рдирдореВрдирд╛ рджреЗрдЦреЗрдВред 4 github рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдирддреАрдЬрддрди, рдХреЛрдб рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИред рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рднрд░реЗ рд╣реБрдП рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдирдИ рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрдХ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдмрдлрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, ProcessLine рдФрд░ IndexOf рдмрд╛рдЗрдЯ [], рдСрдлрд╝рд╕реЗрдЯ рдФрд░ рдХрд╛рдЙрдВрдЯ рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рд╕реНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХ рдмрдлрд░ рдХреЗ рдПрдХ рдЦрдВрдб рдпрд╛ рдХрдИ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

рдФрд░ рдЕрдм рд╕рд░реНрд╡рд░ рдЖрдВрд╢рд┐рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдордЧреНрд░ рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. ArrayPoolbyte рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ [] - рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгрд┐рдпрд╛рдБред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм ReadAsync рдпрд╛ WriteAsync рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдмрдлрд╝рд░реНрд╕ рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдордп рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ (рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдкрдиреЗ рдЖрдИ / рдУ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдЪреВрдВрдХрд┐ рдкрд┐рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░рдгреА рдХреЗ рд╡рд┐рдЦрдВрдбрди рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкреВрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред
  2. рдкрдарди рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд░реНрдХ рдХреЗ рдмреАрдЪ рдХреА рдХрдбрд╝реА рдХреЛ рддреЛрдбрд╝рдХрд░ рдереНрд░реВрдкреБрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдмрдлрд╝рд░реНрд╕ рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рдХреЛрдб рдФрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

    • рджреЛ рдЪрдХреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ред
    • рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд░рд╣рд╛ рд╣реИред
    • рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рд▓реВрдк рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред рд╣рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдЪрдХреНрд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ "рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг" рдпрд╛ "рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддрд┐рд░реЛрдз" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
    • рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛред рдЕрдм рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реАрдб рд╕рд╛рдЗрдХрд┐рд▓ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЪрдХреНрд░ рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдкрд░ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
    • рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рддрд░реНрдХ рдХреЛрдб рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ: рдмрдлрд░ рдкреВрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдЙрдзрд╛рд░ рд▓реЗрдирд╛, рдЬреЛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдмрдлрд░ рдкреВрд▓ рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рд╣реИред
    • рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рдмрдлрд╝рд░реНрд╕ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рдореЗрдВ рдмреЗрд╣рдж рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдмрдлрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрдХреЗрдЯ рд░реАрдб рд▓реЙрдЬрд┐рдХ рдЕрднреА рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЬрдЯрд┐рд▓рддрд╛ рдЫрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ (рдФрд░ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ!)ред рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

System.IO.Pipelines рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИред

рдЯреАрд╕реАрдкреА рд╕рд░реНрд╡рд░ рдФрд░ рд╕рд┐рд╕реНрдЯрдо


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ System.IO.Pipelines рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  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<byte> 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; } // Make the data available to the PipeReader FlushResult result = await writer.FlushAsync(); if (result.IsCompleted) { break; } } // Tell the PipeReader that there's no more data coming writer.Complete(); } async Task ReadPipeAsync(PipeReader reader) { while (true) { ReadResult result = await reader.ReadAsync(); ReadOnlySequence<byte> buffer = result.Buffer; SequencePosition? position = null; do { // Look for a EOL in the buffer position = buffer.PositionOf((byte)'\n'); if (position != null) { // Process the line ProcessLine(buffer.Slice(0, position.Value)); // Skip the line + the \n character (basically position) buffer = buffer.Slice(buffer.GetPosition(1, position.Value)); } } while (position != null); // Tell the PipeReader how much of the buffer we have consumed reader.AdvanceTo(buffer.Start, buffer.End); // Stop reading if there's no more data coming if (result.IsCompleted) { break; } } // Mark the PipeReader as complete reader.Complete(); } 

рджреЗрдЦреЗрдВ g5ub рдкрд░ sample5.cs

рд╣рдорд╛рд░реЗ рд▓рд╛рдЗрди рд░реАрдбрд░ рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЛ рдЫреЛрд░реЗрдВ рд╣реИрдВ:

  • FillPipeAsync рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдкрд╛рдЗрдкрд╡рд┐рдЯрд░ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИред
  • ReadPipeAsync рдкрд╛рдЗрдкрд░рд╛рдЗрдбрд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдлрд╝рд░реНрд╕ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ System.IO.Pipelines рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕рднреА рдмрдлрд╝рд░ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдп рдкрд╛рдЗрдкрд░рд╛рдЗрдбрд░ / рдкрд╛рдЗрдкрд╡рд┐рдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╣рдо рдЬрдЯрд┐рд▓ рдмрдлрд░ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ рд▓реВрдк рдореЗрдВ, рдореБрдЦреНрдп рд▓реЗрдЦрдХ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рдЗрдкрд╡реЗрдЯрд░.рдЧреЗрдЯрдореИрд░реА (рдЗрдВрдЯ) рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкрд╛рдЗрдкрд╡реЗрдЯрд░ред рдПрдбрд╡рд╛рдВрд╕ (рдЗрдВрдЯ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рдЗрдкрд╡рд┐рдЯрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдлрд░ рдХреЛ рдХрд┐рддрдирд╛ рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж pipWriter.FlushAsync () рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рдЗрдкрдЖрд░рдбрд░ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХреЗред

рджреВрд╕рд░рд╛ рд▓реВрдк рдЙрди рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд╡рд░реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЙрдХреЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рдереЗред рдЬрдм pipReader.ReadAsync () рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ ReadResult рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рд╣реЛрддреЗ рд╣реИрдВ: рдбреЗрдЯрд╛ ReadOnlySequence, рд╕рд╛рде рд╣реА рддрд╛рд░реНрдХрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ IsCompleted рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рдардХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реЗрдЦрдХ рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (EOF)ред рдЬрдм рд▓рд╛рдЗрди рдЯрд░реНрдорд┐рдиреЗрдЯрд░ (рдИрдУрдПрд▓) рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд╛рдЗрдкрд░рд╛рдЗрдбрд░.рдПрдбрд╡реЗрдВрд╕рдЯреЙ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрд╛рдЗрдкрд░реАрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдирд╛ рдбреЗрдЯрд╛ рдЦрдкрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкрд╛рдардХ рдФрд░ рд▓реЗрдЦрдХ рджреЛрдиреЛрдВ рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдореБрдЦреНрдп рдЪреИрдирд▓ рд╕рднреА рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред

System.IO.Pipelines


рдЖрдВрд╢рд┐рдХ рдкрдврд╝рдирд╛


рдореЗрдореЛрд░реА рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, System.IO.Pipelines рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдЪреИрдирд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкрд╛рдЗрдк-рд░рд╛рдЗрдбрд░ рдХреЗ рджреЛ рдореБрдЦреНрдп рдПрдкреАрдЖрдИ рд╣реИрдВ: ReadAsync рдФрд░ AdvanceToред ReadAsync рдЪреИрдирд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, AdvanceTo рдкрд╛рдЗрдкрд░реАрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЕрдм рд░реАрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдореБрдЦреНрдп рдмрдлрд░ рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдВ)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ HTTP рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдВрд╢рд┐рдХ рдЪреИрдирд▓ рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реНрдЯрд╛рд░реНрдЯ рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред



ReadOnlySequenceT


рдЪреИрдирд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдЗрдкрд╡реЗрдЯрд░ рдФрд░ рдкрд╛рдЗрдкрд░реАрдбрд░ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рд╕рдВрдмрдВрдзрд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред PipReader.ReadAsync ReadOnlySequence рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ BCL рдХрд╛ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ ReadOnlyMemory <T> рд╕реЗрдЧрдореЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкреИрди рдпрд╛ рдореЗрдореЛрд░реА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред



рдЪреИрдирд▓ рдХреЗ рдЕрдВрджрд░ рдРрд╕реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдардХ рдФрд░ рд▓реЗрдЦрдХ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдбреЗрдЯ рднреА рдХрд░реЗрдВред SequencePosition рдмрдлрд╝рд░реНрд╕ рдХреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдПрдХрд▓ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ ReadOnlySequence <T> рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ ReadOnlySequence <T> рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рдХрд╛ рдорд╛рдирдХ рд╕рдВрдЪрд╛рд▓рди рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреЗрдЬрд╝ рдФрд░ рдзреАрдореА рдкрде рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдБ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ ASCII ReadOnlySequence рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:

  string GetAsciiString(ReadOnlySequence<byte> buffer) { if (buffer.IsSingleSegment) { return Encoding.ASCII.GetString(buffer.First.Span); } return string.Create((int)buffer.Length, buffer, (span, sequence) => { foreach (var segment in sequence) { Encoding.ASCII.GetChars(segment.Span, span); span = span.Slice(segment.Length); } }); } 

рдирдореВрдирд╛ рджреЗрдЦреЗрдВред github рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддрд┐рд░реЛрдз рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг


рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдкрдврд╝рдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рд░реАрдб рд╕реНрдЯреНрд░реАрдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реНрдЯреНрд░реАрдо рдХреБрдЫ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рддреА рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдорддреМрд░ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд░реАрдб рд╕реНрдЯреНрд░реАрдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдб рд╕реНрдЯреНрд░реАрдо рдХреЛ рдпрд╛ рддреЛ рдзреАрдорд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╖реНрдЯрддрдо рдкреНрд░рджрд░реНрд╢рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдард╣рд░рд╛рд╡ рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рдЖрд╡рдВрдЯрди рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрддреБрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рджреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдп рд╣реИрдВ: рдкреЙрдЬрд╝рд╡рд░рд╛рдЗрдЯрд░рдЯреНрд░реЗрд╢реЛрд▓реНрдб рдФрд░ рд░рд┐рдЬреНрдпреВрдорд╡реЗрдпрд░ рд░рд╛рдЗрдЯрд░рд╣реЙрд▓реНрдбред PauseWriterThreshold рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд╡рд┐рдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рддрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрдлрд░ рдХрд░рдирд╛ рд╣реИред ResumeWriterThreshold рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рдардХ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред



PipWriter.FlushAsync "рд▓реЙрдХ" рддрдм рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреНрдб рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдкреЙрдЬрд╝рд╡рд░реНрдЯрд░ рдереНрд░реЗрд╢реЛрд▓реНрдб рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрдм рд░реЗрдЬреНрдпреВрдореЗрд╡рд┐рдЯрд░ рдереНрд░реЗрд╢реЛрд▓реНрдб рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ "рдЕрдирд▓реЙрдХ" рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЦрдкрдд рдХреА рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

I / O рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ


рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдмрд╛рдж рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдпрд╛ рддреЛ рдкреВрд▓ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

I / O рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдореЙрдирд┐рдЯрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд╣рд╛рдБ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред System.IO.Pipelines, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдбреНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╣реА рд╕рдЯреАрдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ I / O рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Kestrel Libuv рдкрд░рд┐рд╡рд╣рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ I / O рдХреЙрд▓рдмреИрдХ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЗ рд╕рдорд░реНрдкрд┐рдд рдЪреИрдирд▓реЛрдВ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдкрд╛рдЗрдкрд░реЗрдбрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреНрдп рд▓рд╛рдн рд╣реИрдВред


  • рдХреБрдЫ рдмреЗрд╕ рд╕рд┐рд╕реНрдЯрдо "рдмрдлрд░рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ" рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ: рдЖрдкрдХреЛ рдмреЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рддрдХ рдмрдлрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдкреЛрд▓ рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдкрд░, рдЖрдк рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рд░реАрдб рдмрдлрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдереНрд░реЗрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рдХреЗ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ: рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рдЗрд╕ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕реАрдзреЗ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗред рдпрд╣ рдЖрдВрд╢рд┐рдХ рдбреЗрдЯрд╛ рднреЗрдЬрдХрд░ рдЬрдЯрд┐рд▓ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред ASP.NET Core рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Kestrel рдХреЗ http рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреВрд▓реНрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред
  • рд╕рд┐рд╕реНрдЯрдо рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ рдореБрдЦреНрдп рдУрдПрд╕ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдВрдЬреАрдХреГрдд рд╡рд┐рдВрдбреЛрдЬ I / O рдПрдкреАрдЖрдИ) рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдЗрдкрд░реЗрдбрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рдмрдлрд╝рд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЕрдиреНрдп рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░


рд╣рдордиреЗ System.IO.Pipelines рдкрд░ рдХрдИ рдирдП рд╕рд░рд▓ BCL рдкреНрд░рдХрд╛рд░ рднреА рдЬреЛрдбрд╝реЗ:

  • MemoryPoolT , IMemoryOwnerT , MemoryManagerT ред ArrayPoolT рдХреЛ .NET Core 1.0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ .NET Core 2.1 рдореЗрдВ рдЕрдм рдкреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдореЗрдореЛрд░реАрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдмрд┐рдВрджреБ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╡рд┐рддрд░рдг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдмрдлрд░ рдкреНрд░рдмрдВрдзрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред
  • IBufferWriterT рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдмрдлрд╝рд░реНрдб рдбреЗрдЯрд╛ (рдкрд╛рдЗрдкрд╡рд░реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рд╕реАрд╡рд░ рд╣реИред
  • IValueTaskSource - ValueTaskT .NET рдХреЛрд░ 1.1 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж рд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди .NET Core 2.1 рдореЗрдВ рдЗрд╕рдиреЗ рдмреЗрд╣рдж рдкреНрд░рднрд╛рд╡реА рдЙрдкрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рд╣реИрдВ рдЬреЛ рд╡рд┐рддрд░рдг рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрдмрд╛рдз рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВред

рдХрдиреНрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?


API рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ System.IO.Pipelines рдореЗрдВ рд╣реИрдВ ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .NET рд╕рд░реНрд╡рд░ 2.1 рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬреЛ рдирд┐рдЪрд▓реА рд╕рдВрджреЗрд╢реЛрдВ (рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред рдЗрд╕реЗ рдбреЙрдЯрдиреЗрдЯ рд░рди (рдпрд╛ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреЛрд░реНрдЯ 8087 рдкрд░ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рдлрд┐рд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХрдВрд╕реЛрд▓ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдкреЛрд░реНрдЯ 8087 рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ, рдЬреИрд╕реЗ рдХрд┐ рдиреЗрдЯрдХреИрдЯ рдпрд╛ рдкреЛрдЯреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд▓реЛрдЕрд░рдХреЗрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдкрд╛рдЗрдкрд▓рд╛рдЗрди Kestrel рдФрд░ SignalR рдкрд░ рдЪрд▓рддреА рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрдИ рдиреЗрдЯрд╡рд░реНрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ .NET рд╕рдореБрджрд╛рдп рдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдЖрд╡реЗрджрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi423105/


All Articles