ValueTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВ рдФрд░ рдХрдм рдХрд░реЗрдВ

рдпрд╣ рдЕрдиреБрд╡рд╛рдж рдЕрдЪреНрдЫреА рдЯрд┐рдкреНрдкрдгреА 0x1000000 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛ред

рдЫрд╡рд┐


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


рдХрд╛рд░реНрдп


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


SomeOperationAsync().ContinueWith(task => { try { TResult result = task.Result; UseResult(result); } catch (Exception e) { HandleException(e); } }); 

рд▓реЗрдХрд┐рди .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдФрд░ рд╕реА # 5 рдореЗрдВ, рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдмрд╕ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЗрдЬ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдпрд╛ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ:


 TResult result = await SomeOperationAsync(); UseResult(result); 

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


 TResult result = await SomeOperationAsync(); UseResult(result); 

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реИрдВред рд╣рдореЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рд╣рдо рдмрд╕ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╡рд╛рджреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╡рд╣ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╣рдо рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TResult рдкрд░рд┐рдгрд╛рдо = SomeOperation ();), рдФрд░ рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


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


рд░рдирдЯрд╛рдЗрдо рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


 public async Task WriteAsync(byte value) { if (_bufferedCount == _buffer.Length) { await FlushAsync(); } _buffer[_bufferedCount++] = value; } 

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


 public async Task<bool> MoveNextAsync() { if (_bufferedCount == 0) { await FillBuffer(); } return _bufferedCount > 0; } 

рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдлрд░ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдзрд┐ рдмрд╕ _bufferedCount рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ, рдпрд╣ рджреЗрдЦрддреА рд╣реИ рдХрд┐ рдпрд╣ 0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╣реА рд╣реИ; рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдмрдлрд░ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдк рдмреВрд▓рд┐рдпрди (рд╕рддреНрдп рдФрд░ рдЕрд╕рддреНрдп) рдХреЗ рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╡ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдкрд░реНрдпрд╛рд╡рд░рдг рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЬреНрдЮрд╛рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдкрд░реНрдпрд╛рд╡рд░рдг рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╡рд┐рдзрд┐:


 public async Task<int> ReadNextByteAsync() { if (_bufferedCount == 0) { await FillBuffer(); } if (_bufferedCount == 0) { return -1; } _bufferedCount--; return _buffer[_position++]; } 

рднреА рдЕрдХреНрд╕рд░ рддреБрд▓реНрдпрдХрд╛рд▓рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдмреБрд▓рд┐рдпрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╡рд┐рдзрд┐ Int32 рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ 4 рдмрд┐рд▓рд┐рдпрди рдорд╛рди рд╣реИрдВ, рдФрд░ рдЯрд╛рд╕реНрдХ <int> рдХреЗ рд╕рднреА рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реИрдХрдбрд╝реЛрдВ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкрд░реНрдпрд╛рд╡рд░рдг рдЯрд╛рд╕реНрдХ <int> рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдХреИрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд рд╕реЗрдЯ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ 4 рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ (рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдлрд░ рдореЗрдВ рд╣реИ) рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдХреИрд╢реНрдб рдЯрд╛рд╕реНрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдорд╛рди 42 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЯрд╛рд╕реНрдХ <int>, Task.FromResult (42) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред


рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреИрд╢ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MemoryStream.ReadAsync рд╡рд┐рдзрд┐ рдХреЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдореЗрдВ рдПрдХ рдЕрдзрд┐рднрд╛рд░ рд╣рдореЗрд╢рд╛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрдореЛрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИред ReadAsync рдПрдХ рдЯрд╛рд╕реНрдХ <int> рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ Int32 рдкрд░рд┐рдгрд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗ рдЧрдП рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд▓реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдФрд░ рдЕрдХреНрд╕рд░ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ ReadAsync рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЯрд╛рд╕реНрдХ <int> рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ рдХреЙрд▓ рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдореЗрдореЛрд░реАрд╕реНрдЯреНрд░реАрдо рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреИрд╢ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рд╕рдлрд▓ рдХреЙрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рдФрд░ рдЕрдЧрд▓реА рдХреЙрд▓ рдореЗрдВ, рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреИрд╢ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ Task.FromResult рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рдХреИрд╢ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред


рдлрд┐рд░ рднреА, рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рд╕реНрдХ <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


ValueTask <TResult> рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди


рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП .NET рдХреЛрд░ 2.0 рдореЗрдВ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдХрд┐ NuGet System.Threading.Tasks.Extension рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдерд╛: ValueTask <TResult> рдкреИрдХреЗрдЬред
ValueTask <TResult> рдХреЛ .NET Core 2.0 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ TResult рдФрд░ Task <TResult> рджреЛрдиреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ async рд╡рд┐рдзрд┐ рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдвреЗрд░ рдкрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдЖрдк рдмрд╕ рдЗрд╕ рд╡реИрд▓реНрдпреВрд╕реНрдХрд╕реНрдХ <TResult> рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡реИрд▓реНрдпреВ рдПрдмреЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд╛рд╕реНрдХ <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ ValueTask <TResult> рдЗрд╕реЗ рд▓рдкреЗрдЯреЗрдЧрд╛ (рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Async рд╡рд┐рдзрд┐, рдЬреЛ рдПрдХ рдЕрд╕рдорд░реНрдерд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдЯрд╛рд╕реНрдХ <TResult> рдХреЛ рднреА рдЬрдЧрд╣ рджреЗрдЧреА) ValueTask <TResult> рдмрд╕ рдЯрд╛рд╕реНрдХ <TResult> рдХреЛ рднреА рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛)ред


рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, MemoryStream.ReadAsync рдЬреИрд╕реА рдПрдХ рд╡рд┐рдзрд┐, рд▓реЗрдХрд┐рди ValueTask <int> рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реБрдП, рдХреИрд╢рд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 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> рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди


рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реИред рдЗрд╕реАрд▓рд┐рдП ValueTask <TResult> рдХреЛ .NET Core 2.0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдирдП рддрд░реАрдХреЛрдВ рд╕реЗ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдм рдЯрд╛рд╕реНрдХ <TResult> рдХреЗ рдмрдЬрд╛рдп ValueTask <TResult> рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдордиреЗ .NET рдХреЛрд░ 2.1 рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рд░реАрдбрд╛рдпрд╕ рдУрд╡рд░рд▓реЛрдб рдЬреЛрдбрд╝рд╛, рддреЛ рдмрд╛рдЗрдЯ [] рдХреЗ рдмрдЬрд╛рдп рдореЗрдореЛрд░реА рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдореЗрдВ ValueTask <int> рдЯрд╛рдЗрдк рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд░реВрдк рдореЗрдВ, рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдЬрд┐рд╕рдореЗрдВ рд░реАрдбрдПрд╕реНрдкреВрдиреНрд╕ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдмрд╛рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрдореЛрд░реАрд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдХрдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рд╣рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреИрдВрдбрд╡рд┐рдбреНрде рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рд╣рдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред
рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЙрдбрд▓ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдкрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХреЙрд▓рдмреИрдХ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реАрдк рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЪреИрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрд╢рдиред рдпрд╣, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдкреАрдЖрдИ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХрдИ рдордзреНрдпрд╡рд░реНрддреА async рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреИрд░-рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред
.NET Core 2.1 рдореЗрдВ, ValueTask <TResult> рд╡рд░реНрдЧ рдХреЛ рд╕рдорд╛рди рдкреВрд▓рд┐рдВрдЧ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЗрд╡рд▓ TResult рдпрд╛ рдЯрд╛рд╕реНрдХ <TResult> рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд░реНрдЧ рдПрдХ рдирдпрд╛ IValueTaskSource <TResult> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдПрдХ ValueTask <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреИрд╕реЗ рдЯрд╛рд╕реНрдХ <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 рдЬреИрд╕реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ (рд╕рдлрд▓ рдпрд╛ рдирд╣реАрдВ)ред OnCompleted рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░реНрдг рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GetResult рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рдХреЙрд▓рд░ рдХреЛ TResult рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреЗрд╡рд▓ рдПрдХ ValueTask рд▓реМрдЯрд╛рддреА рд╣реИрдВ <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ, рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдЕрдВрдзреЗрд░реЗ рдореЗрдВ рд░рд╣реЗрдЧреАред рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рди-рдорд╣рддреНрд╡рдкреВрд░реНрдг API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


.NET Core 2.1 рдореЗрдВ рдРрд╕реЗ рдПрдкреАрдЖрдИ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рд╡рд┐рдзрд┐рдпрд╛рдБ Socket.ReceiveAsync рдФрд░ Socket.SendAsync рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирдП рдЕрдзрд┐рднрд╛рд░ 2.1 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП


 public ValueTask<int> ReceiveAsync(Memory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default); 

рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдПрдХ ValueTask рджреЗрддрд╛ рд╣реИ <int>ред рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реА рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ ValueTask <int> рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 int result = тАж; return new ValueTask<int>(result); 

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


 IValueTaskSource<int> vts = тАж; return new ValueTask<int>(vts); 

рд╕реЙрдХреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рд╛рдЧрдд рдХреЗ рд▓рд┐рдП рдкреВрд▓ рдореЗрдВ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдУрд╡рд░рд▓реЛрдб рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреАред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ NetworkStream рд╡рд░реНрдЧ рдореЗрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .NET Core 2.1 рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 public virtual ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken); 

рдЬрд┐рд╕реЗ NetworkStream рдореЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред NetworkStream.ReadAsync рд╡рд┐рдзрд┐ рдмрд╕ Socket.ReceiveAsync рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдЬреАрдд NetworkStream рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛ, рдФрд░ NetworkStream.ReadAsync рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛ рддреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдЕрдирд╢реЗрдб рд╡реИрд▓реНрдпреВрдЯреИрд╕реНрдХ


рдЬрдм ValueTask <TResult> .NET рдХреЛрд░ 2.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рддреЛ рдХреЗрд╡рд▓ рд╕рдордХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдорд╛рдорд▓реЗ рдХреЛ рдЯрд╛рд╕реНрдХ <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрджрд┐ TResult рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рд╡реИрд▓реНрдпреВрдЯреИрд╕реНрдХ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА: рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдВрдЧрд▓рдЯрди рдЯрд╛рд╕реНрдХ редCompletedTask рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП async рдореЗрдВ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рдерд╛ред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдЕрдирд╕рд░реНрдбреЗрдб рд╡реИрд▓реНрдпреВрдЯреИрд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред .NET Core 2.1 рдореЗрдВ, рд╣рдордиреЗ рдЬреЗрдиреЗрд░рд┐рдХ ValueTask рдФрд░ IValueTaskSource рдкреЗрд╢ рдХрд┐рдпрд╛ред рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдордХрдХреНрд╖ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд╕рд╛рдеред


IValueTaskSource / IValueTaskSource <T> рд▓рд╛рдЧреВ рдХрд░реЗрдВ


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


  • AwaitableSocketAsyncEventArgs
  • AsyncOperation <TResult>
  • DefaultPipeReader

рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, .NET рдХреЛрд░ 3.0 рдореЗрдВ рд╣рдо рдореИрдиреБрдЕрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдХрд╛ рдереЛрдХ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ https://github.com/dotnet/corefx/issues/32664 рд╕реЗ рдбреЙрдЯрдиреЗрдЯ / рдХреЛрд░рдлреИрдХреНрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред


ValueTasks рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреИрдЯрд░реНрди


рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, ValueTask рдФрд░ ValueTask <TResult> рдХрд╛ рджрд╛рдпрд░рд╛ рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ <TResult> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рдмрд╕ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ рд╡реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ <TResult> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрд╢рди рдХрднреА рднреА ValueTask / ValueTask <TResult> рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП:


  • рдмрд╛рд░-рдмрд╛рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ ValueTask / ValueTask <TResult> рдкрд░рд┐рдгрд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреВрд╕рд░реЗ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЯрд╛рд╕реНрдХ / рдЯрд╛рд╕реНрдХ <TResult> рдПрдХ рдкреВрд░реНрдг рдЕрд╡рд╕реНрдерд╛ рд╕реЗ рдЕрдкреВрд░реНрдг рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдХрднреА рднреА рд╕рдВрдХреНрд░рдордг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡реИрд▓реНрдпреВрдЯреИрд╕реНрдХ / рд╡реИрд▓реНрдпреВрд╕реНрдХреИрд╕реНрдХ <TResult> рдкрд░рд┐рдгрд╛рдо рд╡рд╕реНрддреБ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рджреМрдбрд╝ рдФрд░ рд╕реВрдХреНрд╖реНрдо рдХрд╛рд░реНрдпрдХреНрд░рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЕрдорд╛рдиреНрдп "рдкреБрдирдГ рдкреНрд░рддреАрдХреНрд╖рд╛" рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рднреА рд╣реИред рддреБрд▓рдирд╛ рдореЗрдВ, рдЯрд╛рд╕реНрдХ / рдЯрд╛рд╕реНрдХ <TResult> рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ .GetAwaiter ()ред GetResult () рдЬрдм рдСрдкрд░реЗрд╢рди рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред IValueTaskSource / IValueTaskSource <TResult рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рд▓реЙрдХрд┐рдВрдЧ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░реЗрд╕рд┐рдВрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рд╢рд╛рдпрдж рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЯрд╛рд╕реНрдХ / рдЯрд╛рд╕реНрдХ <TResult> рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ ValueTask рдпрд╛ ValueTask <TResult> рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрди рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .AsTask (), рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ / рдХрд╛рд░реНрдп <TResult> рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рдкреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдм рдЙрд╕ ValueTask / ValueTask <TResult> рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдирд┐рдпрдо рдпрд╣ рд╣реИ: ValueTask / ValueTask <TResult> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдВрднрд╡рдд: .ConfigureAwait (рдЭреВрдард╛) рдХреЗ рд╕рд╛рде) рдпрд╛ AsTask () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ:


 //   ,  ValueTask<int> 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(); //       , //     // BAD: await   ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); int result = await vt; int result2 = await vt; // BAD: await  (    ) ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); Task.Run(async () => await vt); Task.Run(async () => await vt); // BAD:  GetAwaiter().GetResult(),     ValueTask<int> vt = SomeValueTaskReturningMethodAsync(); int result = vt.GetAwaiter().GetResult(); 

рдПрдХ рдФрд░ рдЙрдиреНрдирдд рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдХреЗрд╡рд▓ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдорд╛рдк рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред ValueTask / ValueTask <TResult> рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХрдИ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IsCompleted рд╕рдВрдкрддреНрддрд┐ рд╕рд╣реА рд╣реИ рдЕрдЧрд░ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реБрдЖ (рдЕрд░реНрдерд╛рдд, рдпрд╣ рдЕрдм рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реБрдЖ рдпрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ), рдФрд░ IsCompletedSuccessfully рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рд╣реА рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реБрдЖ (рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдерд╛)ред рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдБ рдбреЗрд╡рд▓рдкрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЧрддреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЗрди рдЧреБрдгреЛрдВ рдХреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ValueTask / ValueTask <TResult> рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, .AsTask ()ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .NET Core 2.1 рдореЗрдВ SocketsHttpHandler рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреЛрдб рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ ValueTask <int> рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рдЬрд▓реНрджреА рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдзрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣реБрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдмреАрдЪ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝ рджреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рддрдирд╛рд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рдЕрдЧрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 int bytesRead; { ValueTask<int> readTask = _connection.ReadAsync(buffer); if (readTask.IsCompletedSuccessfully) { bytesRead = readTask.Result; } else { using (_connection.RegisterCancellation()) { bytesRead = await readTask; } } } 

рдХреНрдпрд╛ рд╣рд░ рдирдИ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдПрдХ ValueTask / ValueTask <TResult> рд▓реМрдЯрд╛рдПрдЧреА?


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП: рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдЯрд╛рд╕реНрдХ / рдЯрд╛рд╕реНрдХ <TResult> рдЪреБрдирдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ <TResult> ValueTask рдФрд░ ValueTask <TResult> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдкреНрд░рджрд░реНрд╢рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рд░реНрдп рдФрд░ рдХрд╛рд░реНрдп <TResult> рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЯрд╛рд╕реНрдХ <TResult> рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡реИрд▓реНрдпреВрдЯреИрд╕реНрдХ <TResult> рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдЫреЛрдЯреА рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдорд╛рдЗрдХреНрд░реЛ-рдмреЗрдВрдЪрдорд╛рд░реНрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ <TResult> ValueTask <TResult> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдп рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдп рдпрд╛ рдХрд╛рд░реНрдп рджреЗрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рд░реНрдп рдпрд╛ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред ValueTask / ValueTask <TResult> рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рдХрдИ рд╢рдмреНрджреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрдирдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдПрд╕рд┐рдВрдХреНрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗред

- ValueTask/ValueTask<TResult> : ) , await, ) , ) , . , / .


ValueTask ValueTask<TResult>?


.NET , Task/Task<TResult>, , ValueTask/ValueTask<TResult>, , . тАУ IAsyncEnumerator<T>, .NET Core 3.0. IEnumerator<T> MoveNext, bool, IAsyncEnumerator<T> MoveNextAsync. , , Task, . , , , ( ), await foreach, ValueTask. , . C# , , , .

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


All Articles