рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА
рдмрд╛рдд рдХреА рдХрд┐ рдХреНрдпрд╛ C # рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп Equals рдФрд░ GetHashCode рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЬ рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рдЕрдм рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрдВ!

Msdn рдмреНрд▓реЙрдЧ рдкрд░ рдкрд┐рдЫрд▓реЗ рджреЛ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдордиреЗ
C # рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА
рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрд╛ рдФрд░
рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ C # рд╕рдВрдХрд▓рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрд┐рд▓реНрдбрд░ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐, рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреА рдХреАрдордд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдХрд┐рддрдирд╛ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ?
рдЬрдм рддрдХ рдЯреАрдкреАрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛, рддрдм рддрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдЗрддрдиреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП, рд▓рд╛рдЧрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди рдЖрдЬ, рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рднреА рд╕реИрдХрдбрд╝реЛрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╣рдЬрд╛рд░реЛрдВ рдирд╣реАрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбред рдЯреАрдкреАрдПрд▓ рд╕рдорд╛рдирд╛рдВрддрд░ рдЯрд╛рд╕реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдРрд╕реЗ рдХрд╛рд░реНрдпрднрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдмрдирд╛рдИ рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рд▓рд╛рдЧрдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
public class StockPrices { private const int Count = 100; private List<(string name, decimal price)> _stockPricesCache;
StockPrices
рдХреНрд▓рд╛рд╕ рдПрдХ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рд╕реНрдЯреЙрдХ рдХреА рдХреАрдорддреЛрдВ рдХреЛ
StockPrices
рдФрд░ рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдХреАрдорддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реИред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рд▓рд╛рдЧрдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕реНрдЯреЙрдХ рдХреА рдХреАрдорддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдЦрд┐рдХ рдЦреЛрдЬ рд╣реИред
GetPricesFromCache
рд╡рд┐рдзрд┐ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реВрдк рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИред
рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдп-рдЖрдзрд╛рд░рд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛
рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрджреНрдзрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ (
GetStockPriceForAsync
) рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ (
GetStockPriceFor
) рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред
private readonly StockPrices _stockPrices = new StockPrices(); public SyncVsAsyncBenchmark() {
рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ:

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдореЗрдВ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдЖрдВрдХрдбрд╝реЗ рдорд┐рд▓реЗ рд╣реИрдВ:
- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред
GetPricesForAsync
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 15% (*) рдзреАрдорд╛ рд╣реИред - рд╕рд┐рдВрдХреНрд░реЛрдирд╕
GetPricesFor
рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ InitializeMapIfNeededAsync
рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдХреА рд▓рд╛рдЧрдд рднреА рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрдкрд░реЛрдХреНрдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХреЙрд▓рдо рдореЗрдВ, рдпрд╣ GetPricesDirectlyFromCache
рдФрд░ GetStockPriceFor
рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд 0 рд╣реИред
(*) рдмреЗрд╢рдХ, рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП 15% рд╣реИред рдпрд╣ рдорд╛рди рд╕реАрдзреЗ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд╛рд░реНрдпрднрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ (рдЬреЛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ (рдЬреЛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╢реБрджреНрдз рдЖрд╣реНрд╡рд╛рди рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреА рд▓рд╛рдЧрдд, рдЬреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╣реИрдВредрдпрд╣ рдХреИрд╕реЗ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк
InitializeMapIfNeededAsync
рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрд╕рд╛рдзрди рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ? рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реЗрдбрд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рдпрдВред рдЖрдЗрдП рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред
рдЕрдиреБрдХреВрд▓рди # 1: рдЬрдм рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
AsyncMethodBuilder
рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд┐рдП рдЧрдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдЬреЛ
Task
рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╡рд╣
SetResult
рдХреЛ
SetResult
рддрд░реНрдХ рдкрджреНрдзрддрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ:
SetResult
рд╡рд┐рдзрд┐
SetResult
рдХреЗрд╡рд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд┐рдП рдЧрдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
рдкреНрд░рддреНрдпреЗрдХ Task
рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рднреА рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
[Test] public void AsyncVoidBuilderCachesResultingTask() { var t1 = Foo(); var t2 = Foo(); Assert.AreSame(t1, t2); async Task Foo() { } }
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИред
AsyncTaskMethodBuilder<T>
рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ: рдпрд╣
Task<bool>
рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░
Task<int>
рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдорд╛рдиреЛрдВ рдХреЛ рд░реЗрдВрдЬ рд╕реЗ [-1; 9] (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
AsyncTaskMethodBuilder<T>.GetTaskForResult()
) рджреЗрдЦреЗрдВред
рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдкреБрд╖реНрдЯрд┐ рдХреА рдЧрдИ рд╣реИ:
[Test] public void AsyncTaskBuilderCachesResultingTask() {
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ , рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдФрд░ рдордВрдЪ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рднреА рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рд╕реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рд╕рдВрднрд╡ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЯрд╛рд╕реНрдХ рдХреИрд╢рд┐рдВрдЧ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдХреЛрд░рдлреЙрдХреНрд╕ рд░реЗрдкреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ
Socket
рдХрд╛ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ
рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ
рдХреИрд╢реНрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЕрдиреБрдХреВрд▓рди # 2: ValueTask
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо
ValueTask<T>
(**) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп; рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
ValueTask<T>
T
рдФрд░
Task<T>
ValueTask<T>
рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрдпреЛрдЬрди рд╣реИ: рдпрджрд┐ "value-task" рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдзрд╛рд░ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдореВрд▓ рдЖрд╡рдВрдЯрди рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдЕрддреНрдпрдзрд┐рдХ рд╣реАрдк рдкреНрд░реЛрд╡рд┐рдЬрдирд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
ValueTask<T>
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
GetStockPriceForAsync
рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
Task<decimal>
рдмрдЬрд╛рдп
Task<decimal>
ValueTask<decimal>
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
public async ValueTask<decimal> GetStockPriceForAsync(string companyId) { await InitializeMapIfNeededAsync(); return DoGetPriceFromCache(companyId); }
рдЕрдм рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
[Benchmark] public decimal GetStockPriceWithValueTaskAsync_Await() { return _stockPricesThatYield.GetStockPriceValueTaskForAsync("MSFT").GetAwaiter().GetResult(); }

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
ValueTask
рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЯрд╛рд╕реНрдХ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдвреЗрд░ рдЖрд╡рдВрдЯрди рдХреЛ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдХреНрд░рдордг рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЕрдиреБрдХреВрд▓рди рдирдВрдмрд░ 3: рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрде рдХреЗ рднреАрддрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛
рдпрджрд┐ рдЖрдк рдЕрдХреНрд╕рд░ рдХреБрдЫ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рдЧрдд рдХреЛ рдФрд░ рднреА рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ: рдПрд╕реНрдХрд┐рдВрд╕ рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдкреВрд░реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
рдЬрдЯрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рд╣реИ? рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
public ValueTask<decimal> GetStockPriceWithValueTaskAsync_Optimized(string companyId) { var task = InitializeMapIfNeededAsync();
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
async
рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ
GetStockPriceWithValueTaskAsync_Optimized
рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЗрд╕реЗ
InitializeMapIfNeededAsync
рд╡рд┐рдзрд┐ рд╕реЗ рдХреЛрдИ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕рдХреА рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
DoGetPriceFromCache
рдХрд╛ рдЙрдкрдпреЛрдЧ
DoGetPriceFromCache
рд╣реИред рдпрджрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рдЕрднреА рднреА рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред
рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХрдорд╛рддреНрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдХреИрд╡рд┐рдПрдЯ рд╣реИред рд╕рдмрд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди, рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдмрд╛рд╣рд░реА рд░рд╛рдЬреНрдп (рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рддрд░реНрдХ) рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛:
public ValueTask<decimal> GetStockPriceWithValueTaskAsync_Optimized2(string companyId) {
рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ,
рдПрдХ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг
, рдпрд╣ рдХреЛрдб рдПрдХ рдХреНрд▓реЛрдЬрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рд╡рд╣ рд╡рд┐рдзрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкрде рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
public ValueTask<decimal> GetStockPriceWithValueTaskAsync_Optimized(string companyId) { var closure = new __DisplayClass0_0() { __this = this, companyId = companyId, task = InitializeMapIfNeededAsync() }; if (closure.task.IsCompleted) { return ... }
рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рдХрд┐
C # рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднрдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ , рд╕рдВрдХрд▓рдХ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдРрд╕реА рдХреЛрдб рдкреАрдврд╝реА рдореЗрдВ рдХреБрдЫ рд╕рдордЭрджрд╛рд░реА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реЗ рд╕рдВрдШрд░реНрд╖ рдХреЛ рдмреЗрдХрд╛рд░ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред
рдЯреАрдЖрдИрдкреА ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдкрдЯреА рдмрд╛рдд рд╣реИред рд▓рд╛рдн рдирдЧрдгреНрдп рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк
рд╕рд╣реА рдореВрд▓ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдПрдХ рдмрд╛рд╣рд░реА рд░рд╛рдЬреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдвреЗрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЖрдк рдЕрднреА рднреА рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреАрд╕реАрдПрд▓) рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдЧрддреЗрдВ
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ: рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдЬреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЗрд╕рдХреЗ рд╕рдордЧреНрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрднрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрдВрддреНрд░ рдХреА рд▓рд╛рдЧрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ "рдЗрдВрддрдЬрд╛рд░" рдХрд░рддреА рд╣реИред рдЗрди рд▓рд╛рдЧрддреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
InitializeMapIfNeededAsync
рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреИрд╢ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдкрд░ рднреА
Task.Yield()
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ:
private async Task InitializeMapIfNeededAsync() { if (_stockPricesCache != null) { await Task.Yield(); return; }
рд╣рдо рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
[Benchmark] public decimal GetStockPriceFor_Await() { return _stockPricesThatYield.GetStockPriceFor("MSFT"); } [Benchmark] public decimal GetStockPriceForAsync_Await() { return _stockPricesThatYield.GetStockPriceForAsync("MSFT").GetAwaiter().GetResult(); } [Benchmark] public decimal GetStockPriceWithValueTaskAsync_Await() { return _stockPricesThatYield.GetStockPriceValueTaskForAsync("MSFT").GetAwaiter().GetResult(); }

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рджреЛрдиреЛрдВ рдЧрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдФрд░ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдмрддрд╛рдПрдВред
- рдЕрдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрд╢рди рдореЗрдВ рд▓рдЧрднрдЧ 4 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 300 рдмрд╛рдЗрдЯреНрд╕ (**) рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ GetStockPriceFor рд▓рдЧрднрдЧ рджреЛ рдмрд╛рд░ GetStockPriceForAsync рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдХрдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред
- ValueTask рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдЯрд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддреА рд╣реИ, рдЬрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ValueTask рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди <T> рдЯрд╛рд╕реНрдХ <T> рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдзрд┐ рдХреА рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
(**) рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (x64 рдпрд╛ x86) рдФрд░ рдХрдИ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИредрдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд░реНрд╢рди 101
- рдпрджрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреА рд╣реИ, рддреЛ рдУрд╡рд░рд╣реЗрдб рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред
- рдпрджрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдореЗрдореЛрд░реА рдУрд╡рд░рд╣реЗрдб рд╣реЛрддреА рд╣реИ: рдПрд╕рд┐рдВрдХреНрд╕ рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдЯрд╛рд╕реНрдХ <рдЯреА> рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдУрд╡рд░рд░рди рдкреНрд░рддрд┐ рдСрдкрд░реЗрд╢рди 88 xtes (x 64 рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП) рд╣реИред
- ValueTask <T> рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реНрдпреБрдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
- рдЬрдм ValueTask рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ <T> рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рд╕реНрдХ <T> рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдорд╛рдореВрд▓реА рдЕрдВрддрд░ рд╣реЛрддреЗ рд╣реИрдВред
- рдЕрдзреВрд░рд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ (рд▓рдЧрднрдЧ 300 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддрд┐ рдСрдкрд░реЗрд╢рди xx рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП)ред
рдмреЗрд╢рдХ, рдорд╛рдк рд╣рдорд╛рд░реЗ рд╕рдм рдХреБрдЫ рд╣реИрдВред рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк
Task<T>
рд╕реЗ
ValueTask<T>
рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
Task<T>
рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╕рдордЧреНрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЕрдкрдиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдХреЛрдб рдХрд╛ рд╣рд░ рдЫреЛрдЯрд╛ рдЯреБрдХрдбрд╝рд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред