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);
рдирдореВрдирд╛ рджреЗрдЦреЗрдВред
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) {
рдирдореВрдирд╛ 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) {
рдирдореВрдирд╛ рджреЗрдЦреЗрдВред рей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) {
рдирдореВрдирд╛ рджреЗрдЦреЗрдВред 4 github рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВрдирддреАрдЬрддрди, рдХреЛрдб рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИред рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рднрд░реЗ рд╣реБрдП рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдирдИ рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрдХ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдмрдлрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, ProcessLine рдФрд░ IndexOf рдмрд╛рдЗрдЯ [], рдСрдлрд╝рд╕реЗрдЯ рдФрд░ рдХрд╛рдЙрдВрдЯ рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рд╕реНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХ рдмрдлрд░ рдХреЗ рдПрдХ рдЦрдВрдб рдпрд╛ рдХрдИ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред
рдФрд░ рдЕрдм рд╕рд░реНрд╡рд░ рдЖрдВрд╢рд┐рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдордЧреНрд░ рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- ArrayPoolbyte рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ [] - рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгрд┐рдпрд╛рдБред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм ReadAsync рдпрд╛ WriteAsync рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдмрдлрд╝рд░реНрд╕ рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдордп рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ (рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдкрдиреЗ рдЖрдИ / рдУ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдЪреВрдВрдХрд┐ рдкрд┐рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░рдгреА рдХреЗ рд╡рд┐рдЦрдВрдбрди рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкреВрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред
- рдкрдарди рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд░реНрдХ рдХреЗ рдмреАрдЪ рдХреА рдХрдбрд╝реА рдХреЛ рддреЛрдбрд╝рдХрд░ рдереНрд░реВрдкреБрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдмрдлрд╝рд░реНрд╕ рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рдХреЛрдб рдФрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
- рджреЛ рдЪрдХреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ред
- рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд░рд╣рд╛ рд╣реИред
- рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рд▓реВрдк рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред рд╣рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдЪрдХреНрд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ "рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг" рдпрд╛ "рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддрд┐рд░реЛрдз" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛред рдЕрдм рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реАрдб рд╕рд╛рдЗрдХрд┐рд▓ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЪрдХреНрд░ рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдкрд░ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
- рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рддрд░реНрдХ рдХреЛрдб рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ: рдмрдлрд░ рдкреВрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдЙрдзрд╛рд░ рд▓реЗрдирд╛, рдЬреЛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдмрдлрд░ рдкреВрд▓ рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рд╣реИред
- рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рдмрдлрд╝рд░реНрд╕ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рдореЗрдВ рдмреЗрд╣рдж рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдмрдлрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрдХреЗрдЯ рд░реАрдб рд▓реЙрдЬрд┐рдХ рдЕрднреА рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЬрдЯрд┐рд▓рддрд╛ рдЫрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ (рдФрд░ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ!)ред рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
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) {
рджреЗрдЦреЗрдВ 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 рд╕рдореБрджрд╛рдп рдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдЖрд╡реЗрджрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред