рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд▓реЗрдЦреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦ "рдкрд╛рда рдХреЗ рдХрд░реАрдм" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдХрд╛рдлреА рдЕрдиреБрдХреВрд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рдЕрдкрдиреЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдореВрд▓ рд▓реЗрдЦ рдХреЗ рдкрд╛рда рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рд▓рдХреНрд╖реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдиреБрд╡рд╛рдж рдХреЛ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдпрд╣ рдореВрд▓ рд▓реЗрдЦ рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛред рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕реБрдзрд╛рд░ / рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рдкрд░рд┐рдЪрдп
System.Threading.Tasks
рдирд╛рдо рд╕реНрдерд╛рди рдФрд░ Task
рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рд╕реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдФрд░ рдЗрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ Task<TResult>
, рдиреЗ .NET рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реВ рдмрди рдЧрдП рд╣реИрдВред рдЗрд╕рдХреЗ async/await
рд╕рд╛рде C # 5 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ ValueTask/ValueTask<TResult>
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд ValueTask/ValueTask<TResult>
, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп
Task
рдХрдИ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп "рд╡рд╛рджрд╛" рд╣реИ - рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред рдЖрдк рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Task
рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ Task
рддрдм рдкреВрд░рд╛ рд╣реЛрдЧрд╛ рдЬрдм рдСрдкрд░реЗрд╢рди рд╕реНрд╡рдпрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рдСрдкрд░реЗрд╢рди рд╕рд░реНрдЬрдХ рдереНрд░реЗрдб рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдлрд░ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ ред
- рдСрдкрд░реЗрд╢рди рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╕рд░реНрдЬрдХ
Task
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ рдкреВрд░рд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХрд╛ рддреНрд╡рд░рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдЕрднреА рддрдХ рдмрдлрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдСрдкрд░реЗрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрдЬрдХ
Task
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ Task
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рд╣реИ ред
рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рд╣рдХ рдпрд╛ рддреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред .NET 4 рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдореЙрдбрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ Task
рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ ContinueWith
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛ рдЬрд┐рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
SomeOperationAsync().ContinueWith(task => { try { TResult result = task.Result; UseResult(result); } catch (Exception e) { HandleException(e); } });
.NET Frmaework 4.5 рдФрд░ C # 5 рдХреЗ рд╕рд╛рде, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ async/await
рдХреАрд╡рд░реНрдб рдФрд░ рдЙрдирдХреЗ рдкреАрдЫреЗ рдХреЗ рддрдВрддреНрд░ рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рддрдВрддреНрд░, рдЙрддреНрдкрдиреНрди рдХреЛрдб, рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЬрд┐рд╕ рдкрде рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
TResult result = await SomeOperationAsync(); UseResult(result);
Task
рдХреНрд▓рд╛рд╕ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдИ рдмрд╛рд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА "рдЙрдореНрдореАрдж" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдмрд╛рдж рдХреА рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдЖрдкрдХреЛ Task
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Task
рд╡реЗрдЯрд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рди рд╣реЛ рдЬрд╛рдПред рддрдерд╛рдХрдерд┐рдд рднреА рд╣реИред рдХрд╛рд░реНрдп рд╕реЗрдЯреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЯрд╛рд╕реНрдХ.рдЬреЗрдирдПрдиреА" - рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдмрд╕ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ, рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп, рдЙрдкрд░реЛрдХреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
TResult result = await SomeOperationAsync(); UseResult(result);
рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП TResult result = SomeOperation();
)ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ async/await
рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП, Task
рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рджреЛрд╖ рд╣реИред Task
рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдвреЗрд░ рдкрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреАрд╕реА рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдХрд╛рдо рдкрд░ рдЦрд░реНрдЪ рд╣реЛрддреЗ рд╣реИрдВ, рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рддрд░рдл, Task
рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдЕрдХреНрд╕рд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рдЬрд┐рд╕рд╕реЗ рдереНрд░реВрдкреБрдЯ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрдврд╝ рдЬрд╛рддреА рд╣реИрдВред
рд░рдирдЯрд╛рдЗрдо рдФрд░ рдкреНрд░рдореБрдЦ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
public async Task WriteAsync(byte value) { if (_bufferedCount == _buffer.Length) { await FlushAsync(); } _buffer[_bufferedCount++] = value; }
рдФрд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдмрдлрд░ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рд╣реЛрдЧрд╛, рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд▓реМрдЯреЗ рд╣реБрдП рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдФрд░ рдСрдкрд░реЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо Task
рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ void
рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ред рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд░рдирдЯрд╛рдЗрдо рдмрд╕ Task
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рднреА async Task
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ ( Task.ComletedTask
)ред рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдЖрдЗрдП рдЖрдкрдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
public async Task<bool> MoveNextAsync() { if (_bufferedCount == 0) { await FillBuffer(); } return _bufferedCount > 0; }
рдорд╛рди рд▓реАрдЬрд┐рдП, рдЙрд╕реА рддрд░рд╣, рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдмрдлрд░ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╣реИред рд╡рд┐рдзрд┐ _bufferedCount
рдЬрд╛рдВрдЪ _bufferedCount
, рдпрд╣ рджреЗрдЦрддреА рд╣реИ рдХрд┐ рдЪрд░ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ true
рд▓реМрдЯрд╛рддрд╛ true
ред рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рдордп рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рд╣реЛ рдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рдгрд╛рдо ( true
рдФрд░ false
) рд╣реЛрдВ, рдФрд░ Task<bool>
рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯреНрд╕ рд╣реЛрдВред рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░реНрдгрддрд╛ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд▓реЗрдХрд┐рди рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд░рдирдЯрд╛рдЗрдо Task<bool>
рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ (рдПрдХ рдФрд░ true
рд▓рд┐рдП рдПрдХ) рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ Task<bool>
рдмрдирд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ Task<bool>
рдСрдмреНрдЬреЗрдХреНрдЯ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬреЛ "рд╡рд╛рдкрд╕реА" рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдирдпрд╛ Task<bool>
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд╕рдордп, рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рд▓реМрдЯреА рд╣реБрдИ рд╡рд╕реНрддреБ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдВрддрддрдГ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред
рд░рдирдЯрд╛рдЗрдо рд╕реЗ рд╕рдорд╛рди рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕реА рд░рдгрдиреАрддрд┐ рд╣рд░ рдЬрдЧрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐:
public async Task<int> ReadNextByteAsync() { if (_bufferedCount == 0) { await FillBuffer(); } if (_bufferedCount == 0) { return -1; } _bufferedCount--; return _buffer[_position++]; }
рднреА рдЕрдХреНрд╕рд░ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ рдЪрд╛рд░ рдмрд┐рд▓рд┐рдпрди рд╕рдВрднрд╡ рдорд╛рди рд╣реИрдВред Task<int>
рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕реИрдХрдбрд╝реЛрдВ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдХрдИ рдЫреЛрдЯреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП Task<int>
рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рдХреИрд╢ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ (рдбреЗрдЯрд╛ рдмрдлрд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ), 4 рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдкрд░рд┐рдгрд╛рдо, рднрд▓реЗ рд╣реА рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ 42, рдПрдХ рдирдпрд╛ Task<int>
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ред Task.FromResult(42)
ред
рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреИрд╢ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдХреЗ рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг MemoryStream.ReadAsync
рдХрд╛ рдЕрдзрд┐рднрд╛рд░ рд╣реИред .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпрд╣ рдСрдкрд░реЗрд╢рди, рд╣рдореЗрд╢рд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдореГрддрд┐ рд╕реЗ рдПрдХ рдкрдврд╝рдиреЗ рд╣реИред ReadAsync
рдПрдХ Task<int>
рджреЗрддрд╛ рд╣реИ Task<int>
рдЬрд╣рд╛рдВ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд░рд┐рдгрд╛рдо рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рдХреЛрдб рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рддрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм ReadAsync
рдПрдХ рд▓реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рдХреНрд╖рдг рд╣реИрдВ:
- рдЕрдиреБрд░реЛрдзрд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реВрдк рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ;
- рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ,
ReadAsync
рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдиреБрд░реЛрдзрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, ReadAsync
рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде, рдПрдХ Task<int>
рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ MemoryStream
рдЕрдВрддрд┐рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдХреА рд╕рднреА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдирдпрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреИрд╢ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Task.FromResult
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднреА рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдирдИ Task<TResult>
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
ValueTask <TResult> рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреВрд░реНрдгрддрд╛
рдпрд╣ рд╕рдм, рдЕрдВрддрддрдГ .NET рдХреЛрд░ 2.0 рдореЗрдВ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ ValueTask<TResult>
рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, nuget- рдкреИрдХреЗрдЬ System.Threading.Tasks.Extensions
рдорд╛рдзреНрдпрдо рд╕реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреНрдп .NET рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
ValueTask<TResult>
рдХреЛ .NET Core 2.0 рдореЗрдВ TResult
рдпрд╛ Task<TResult>
рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ async
рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╢реБрд░реВрдЖрдд рд╕реЗ рдкрд╣рд▓рд╛ рдкреНрд▓рд╕ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рд╡рд┐рдзрд┐ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдвреЗрд░ рдкрд░ рдХреБрдЫ рднреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдкрд░рд┐рдгрд╛рдо рдорд╛рди рдХреЗ рд╕рд╛рде ValueTask<TResult>
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╡рд┐рдзрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ Task<TResult>
рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, ValueTask<TResult>
рдЙрдкрдпреЛрдЧ Task<TResult>
рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк ValueTask<TResult>
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ValueTask<TResult>
рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп ValueTask<TResult>
Task<TResult>
рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо Task<TResult>
рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ Task<TResult>
рдмрдирд╛рддрд╛ рд╣реИ, рд╕реНрдореГрддрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ Task<TResult>
рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ Task<TResult>
рд╡рд┐рднрд┐рдиреНрди рдкреВрд░реНрдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП ValueTask<TResult>
рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд░рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
рдЙрдкрд░реЛрдХреНрдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЙрдкрд░реЛрдХреНрдд MemoryStream.ReadAsync
рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public override ValueTask<int> ReadAsync(byte[] buffer, int offset, int count) { try { int bytesRead = Read(buffer, offset, count); return new ValueTask<int>(bytesRead); } catch (Exception e) { return new ValueTask<int>(Task.FromException<int>(e)); } }
ValueTask <TResult> рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдкреНрддрд┐
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ .NET рдХреЛрд░ 2.0 рдореЗрдВ рдирдП ValueTask<TResult>
рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдерд╛ред "рд╣реЙрдЯ рд╕рдбрд╝рдХреЛрдВ" рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдирдП рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдм рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Task<TResult>
рдмрдЬрд╛рдп ValueTask<TResult>
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .NET рдХреЛрд░ 2.1 рдореЗрдВ (рдЬреЛ рдХрд┐ Memory<byte>
рдмрдЬрд╛рдп Memory<byte>
рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ) Stream
рд▓рд┐рдП ReadAsync
рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдирдпрд╛ рдЕрдзрд┐рднрд╛рд░, ValueTask<int>
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдЗрд╕рдиреЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрд╡рдВрдЯрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА (рдмрд╣реБрдд рдмрд╛рд░ ReadAsync
рд╡рд┐рдзрд┐ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ ReadAsync
рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдЪреНрдЪ рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЬрд┐рд╕рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдкреНрддрд┐ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, async/await
рдореЙрдбрд▓ рдореЗрдВ, рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдиреЛрдЦрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреИрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд▓реМрдЯреА рд╣реБрдИ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╕реНрддреБ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдкреАрдЖрдИ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд▓ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреВрд▓ рд╕рдорд╡рд░реНрддреА рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдкреВрд▓ рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ "рдкреВрд░реНрдг" рд░рд╛рдЬреНрдп рд╕реЗ "рдкреВрд░рд╛ рдирд╣реАрдВ" рд░рд╛рдЬреНрдп рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, IValueTaskSource<TResult>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ .NET Core 2.1 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ ValueTask<TResult>
рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдЕрдм рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рди рдХреЗрд╡рд▓ TResult
рдпрд╛ Task<TResult>
рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА IValueTaskSource<TResult>
рдЙрджрд╛рд╣рд░рдг IValueTaskSource<TResult>
ред рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ ValueTask<TResult>
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ IValueTaskSource<TResult>
рдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ Task<TResult>
:
public interface IValueTaskSource<out TResult> { ValueTaskSourceStatus GetStatus(short token); void OnCompleted( Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags); TResult GetResult(short token); }
GetStatus
рдЙрдкрдпреЛрдЧ ValueTask<TResult>.IsCompleted/IsCompletedSuccessfully
- рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВ (рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдпрд╛ рдирд╣реАрдВ)ред OnCompleted
рдЙрдкрдпреЛрдЧ ValueTask<TResult>
рдХреЙрд▓рдмреИрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред GetResult
рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХрднреА рднреА IValueTaskSource<TResult>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ, рдЬрдм рд▓реМрдЯреЗ, рддреЛ рдЗрд╕реЗ ValueTask<TResult>
рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рджреЗрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реА рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рдо рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
.NET Core 2.1 рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз Socket.ReceiveAsync
рдХрд╛ рдирдпрд╛ рдЕрдзрд┐рднрд╛рд░ рд╣реИред Socket.ReceiveAsync
рдФрд░ Socket.SendAsync
рддрд░реАрдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public ValueTask<int> ReceiveAsync( Memory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default);
ValueTask<int>
рдЯрд╛рдЗрдк рдХреА ValueTask<int>
рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдпрджрд┐ рд╡рд┐рдзрд┐ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдорд╛рди рдХреЗ рд╕рд╛рде ValueTask<int>
рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
int result = тАж; return new ValueTask<int>(result);
рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХреИрд╢реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ IValueTaskSource<TResult>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
IValueTaskSource<int> vts = тАж; return new ValueTask<int>(vts);
Socket
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреИрд╢реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рддрдХ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛)ред рдпрд╣ рд░рдгрдиреАрддрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЖрд╡рдВрдЯрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред
.NET рдХреЛрд░ 2.1 рдореЗрдВ Socket
рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ NetworkStream
рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рд╛ред рдЗрд╕рдХрд╛ рдЕрдзрд┐рднрд╛рд░ Stream
рдХреНрд▓рд╛рд╕ рдХрд╛ ReadAsync
рд╡рд┐рдзрд┐ рд╣реИ:
public virtual ValueTask<int> ReadAsync( Memory<byte> buffer, CancellationToken cancellationToken);
рдмрд╕ Socket.ReceiveAsync
рд▓рд┐рдП рдХрд╛рдо рдХреЛ Socket.ReceiveAsync
рд╡рд┐рдзрд┐ред рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реЙрдХреЗрдЯ рд╡рд┐рдзрд┐ рдХреА рджрдХреНрд╖рддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐, NetworkStream
рд╡рд┐рдзрд┐ рдХреА рджрдХреНрд╖рддрд╛ рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИред
рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рди
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХрдИ рдмрд╛рд░ рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ .NET рдХреЛрд░ 2.0 рдореЗрдВ ValueTask<T>
рдХрд╛ рдореВрд▓ рд▓рдХреНрд╖реНрдп, "рдЧреИрд░-рд░рд┐рдХреНрдд" рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЧреИрд░-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ValueTask
рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА: рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рддрд░реАрдХреЗ async Task
рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред Task.CompletedTask
рд╕рдВрдкрддреНрддрд┐, рдФрд░ async Task
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде, рдЧреИрд░-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ValueTask
рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, .NET Core 2.1 рдореЗрдВ, рд╣рдордиреЗ рдЧреИрд░- ValueTask
рдФрд░ IValueTaskSource
ред рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЦрд╛рд▓реА ( void
) рд░рд┐рдЯрд░реНрди рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдПред
IValueTaskSource / IValueTaskSource <T> рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░ рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ .NET рдХреЛрд░ 2.1 рдХреЗ рдЕрдВрджрд░, рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЗрди рдХрд╛рд░реНрдпреЛрдВ ( IValueTaskSource / IValueTaskSource<T>
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо .NET рдХреЛрд░ 3.0 рдореЗрдВ ManualResetValueTaskSourceCore<TResult>
рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░ рджреЗрдЧреАред ManualResetValueTaskSourceCore<TResult>
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ IValueTaskSource<TResult>
рдФрд░ / рдпрд╛ IValueTaskSource
, рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдп IValueTaskSource
рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ttps: //github.com/dotnet/corefx/issues/32664 рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
ValueTasks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдореЙрдбрд▓
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд░рд╕рд░реА рдкрд░реАрдХреНрд╖рд╛ рд╕реЗ ValueTask
рдХрд┐ ValueTask
рдФрд░ ValueTask<TResult>
Task
рдФрд░ Task<TResult>
рд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд ValueTask<TResult>
ред рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реАрдорд╛рдПрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдХрд┐ ValueTask
рдФрд░ ValueTask<TResult>
рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ValueTask
/ ValueTask<TResult>
* рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп * рдХрднреА рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП ( рдореБрдЭреЗ "Never" * рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рджреЗрдВ):
- рдХрднреА рднреА рдПрдХ рд╣реА
ValueTask
/ ValueTask<TResult>
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
рдкреНрд░реЗрд░рдгрд╛: Task
рдФрд░ Task<TResult>
рдЙрджрд╛рд╣рд░рдг рдХрднреА рднреА "рдкреВрд░реНрдг" рд╕реНрдерд┐рддрд┐ рд╕реЗ "рдЕрдкреВрд░реНрдг" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, ValueTask
/ ValueTask<TResult>
, рд╡реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд░реИрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рд░рд╛рдЬреНрдп рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ - "рдкреВрд░реНрдг" рд╕реЗ "рдЕрдкреВрд░реНрдг" рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред
- рдХрднреА рднреА
ValueTask
/ ValueTask<TResult>
ValueTask
рди ValueTask
ValueTask<TResult>
рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдореЛрдб рдореЗрдВред
рдкреНрд░реЗрд░рдгрд╛: рдПрдХ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдПрдХрд▓ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕реВрдХреНрд╖реНрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ, рдпрд╣ рдХрдИ рдЙрдореНрдореАрджреЛрдВ рд╕реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Task
/ Task<TResult>
рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЙрдореНрдореАрджреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ
.GetAwaiter().GetResult()
рдЙрдкрдпреЛрдЧ рдХрднреА рди рдХрд░реЗрдВ ред
рдкреНрд░реЗрд░рдгрд╛: IValueTaskSource
/ IValueTaskSource<TResult>
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдЬрдмрдХрд┐ Task
/ Task<TResult>
рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рднреА, рдЖрдкрдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ ValueTask
/ ValueTask<TResult>
рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ? рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, ValueTask
/ ValueTask<TResult>
.AsTask()
рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЖрдкрдХреЛ Task
/ Task<TResult>
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗрдЧрд╛, рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ .AsTask()
рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ ред
: ValueTask
/ ValueTask<TResult>
, ( await
) (, .ConfigureAwait(false)
), .AsTask()
, ValueTask
/ ValueTask<TResult>
.
// Given this ValueTask<int>-returning methodтАж public ValueTask<int> SomeValueTaskReturningMethodAsync(); тАж // GOOD int result = await SomeValueTaskReturningMethodAsync(); // GOOD int result = await SomeValueTaskReturningMethodAsync().ConfigureAwait(false); // GOOD Task<int> t = SomeValueTaskReturningMethodAsync().AsTask(); // WARNING ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); ... // storing the instance into a local makes it much more likely it'll be misused, // but it could still be ok // BAD: awaits multiple times ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); int result = await vt; int result2 = await vt; // BAD: awaits concurrently (and, by definition then, multiple times) ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); Task.Run(async () => await vt); Task.Run(async () => await vt); // BAD: uses GetAwaiter().GetResult() when it's not known to be done ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); int result = vt.GetAwaiter().GetResult();
, "", , ( , ).
ValueTask
/ ValueTask<TResult>
, . , IsCompleted
true
, ( , ), тАФ false
, IsCompletedSuccessfully
true
. " " , , , , , . await
/ .AsTask()
.Result
. , SocketsHttpHandler
.NET Core 2.1, .ReadAsync
, ValueTask<int>
. , , , . , .. . рдХреНрдпреЛрдВрдХрд┐ , , , , :
int bytesRead; { ValueTask<int> readTask = _connection.ReadAsync(buffer); if (readTask.IsCompletedSuccessfully) { bytesRead = readTask.Result; } else { using (_connection.RegisterCancellation()) { bytesRead = await readTask; } } }
, .. ValueTask<int>
, .Result
, await
, .
API ValueTask / ValueTask<TResult>?
, . Task
/ ValueTask<TResult>
.
, Task
/ Task<TResult>
. , "" / , Task
/ Task<TResult>
. , , ValueTask<TResult>
Task<TResult>
: , , await
Task<TResult>
ValueTask<TResult>
. , (, API Task
Task<bool>
), , , Task
( Task<bool>
). , ValueTask
/ ValueTask<TResult>
. , async-, ValueTask
/ ValueTask<TResult>
, .
, ValueTask
/ ValueTask<TResult>
, :
- , API ,
- API ,
- , , , .
, abstract
/ virtual
, , / ?
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
.NET, API, Task
/ Task<TResult>
. , , API c ValueTask
/ ValueTask<TResult>
, . IAsyncEnumerator<T>
, .NET Core 3.0. IEnumerator<T>
MoveNext
, . тАФ IAsyncEnumerator<T>
MoveNextAsync
. , Task<bool>
, , . , , , ( ), , , await foreach
-, , MoveNextAsync
, ValueTask<bool>
. , , , " " , . , C# , .
