
.NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрдИ рдкреНрд░реА-рдмрд┐рд▓реНрдЯ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдФрд░ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреИрд╢ рдпрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░, рдпреЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рдХрдИ рдмрд╛рд░ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ: рддрд╛рд▓реЗ рдкрд░ рд▓рдВрдмрд╛ рдЗрдВрддрдЬрд╛рд░, рд╕реНрдореГрддрд┐ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЦрдкрдд рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ред
рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рд╡реЗ рд╣рдорд╛рд░реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдЙрдкрд░рд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмреЗрдорд╛рдиреА рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдкреНрд░рднрд╛рд╡реА рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧреНрд░рд╣ред
Cutscene рдХреЗ
рддрд╣рдд DotNext рдХреЙрдиреНрдлреНрд░реЗрдВрд╕ рд╕реЗ рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВ рдорд╛рдирдХ .NET рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ (Task.Delay, SemaphoreSlim, ConcurrentDictionary) рдиреЗ рдкреНрд░рджрд░реНрд╢рди рдбреНрд░реЙрдк рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрддрд╛ рд╣реВрдВ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд░рд╣рд┐рдд рд╣реВрдВред рдЗрди рдХрдорд┐рдпреЛрдВред
рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рдордп, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЛрдВрддреВрд░ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ред рдХреЛрдВрдЯреВрд░ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЬрд┐рд╕ рдЯреАрдо рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд░реНрдерди рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЯреАрдореЛрдВ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛рдПрдВ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЯреАрдо рдиреЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╕реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ - рд╕рднреА рд╕реЗрд╡рд╛рдПрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдЬ рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ?
- .NET рдореЗрдВ Multithreading рдФрд░ Asynchrony;
- рд╕реНрдЯреИрдХрд┐рдВрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯреАрдЬрд╝ рдФрд░ рд╕рдВрдЧреНрд░рд╣;
- рдпрджрд┐ рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЛрдб рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЖрдЗрдП .NET рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдб рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рдЖрдЗрдП рдХреБрдЫ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯреАрдЬрд╝ рдФрд░ рд╕рдорд╡рд░реНрддреА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреЗрдЦреЗрдВ, рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рдЕрдВрджрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдХрдХреНрд╖рд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЕрдЧрд░ рдорд╛рдирдХ рдХрдХреНрд╖рд╛рдПрдВ рднрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдХреНрдпрд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдЪрд╛рд░ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдмрддрд╛рдКрдВрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджрди рд╕реНрдерд▓ рдкрд░ рд╣реБрдИ рдереАрдВред
рдЗрддрд┐рд╣рд╛рд╕ 1: рдЯрд╛рд╕реНрдХ.рдбреЗрд▓реЗ рдФрд░ рдЯрд┐рдорд░рдХреНрдпреВ
рдпрд╣ рдХрд╣рд╛рдиреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ DotNext рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реАрдХреНрд╡реЗрд▓ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ред рддреЛ рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ?
1.1 рдорддрджрд╛рди рдФрд░ рд▓рдВрдмрд╛ рдорддрджрд╛рди
рд╕рд░реНрд╡рд░ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрдирдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдкреЛрд▓рд┐рдВрдЧ: рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рд░рд┐рдЬрд▓реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрддрд╛ рд╣реИред
рд▓рдВрдмрд╛ рдорддрджрд╛рди: рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд▓рдВрдмреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
рдлрд╛рдпрджреЗ:
- рдХрдо рдпрд╛рддрд╛рдпрд╛рдд
- рдХреНрд▓рд╛рдЗрдВрдЯ рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддрд╛ рд╣реИ
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдХреБрдЫ рд▓рдВрдмреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкреАрдбреАрдПрдл рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдРрд╕реЗ рдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕реА рдЙрдореНрдореАрдж рдХреИрд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ?
рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛
рдорддрджрд╛рди рд╣реИ ред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ ("рдкреВрд░рд╛ рд╣реБрдЖ" / "рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ" / "рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рд╣реБрдЖ") рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рд░рд┐рдЬрд▓реНрдЯ рдЖрдиреЗ рддрдХ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рднреЗрдЬрддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛
рд▓рдВрдмрд╛ рдорддрджрд╛рди рд╣реИ ред рдпрд╣рд╛рдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП, рддреБрд░рдВрдд рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
рддреЛ рдирд┐рдпрдорд┐рдд рдорддрджрд╛рди рдкрд░ рд▓рдВрдмреЗ рдорддрджрд╛рди рдХрд╛ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдо рдпрд╛рддрд╛рдпрд╛рдд рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдХрдо рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ - рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЧреНрд░рд╛рд╣рдХ рдирд┐рдпрдорд┐рдд рдорддрджрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрдИ рдорддрджрд╛рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░рд╛рд▓ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЬреЛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ?
рдЯрд╛рд╕реНрдХ: рдЯрд╛рдЗрдордЖрдЙрдЯ
рд╣рдо рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЯрд╛рд╕реНрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
Senditync рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ ();
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯрд╛рд╕реНрдХ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдпрд╛ рддреЛ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рднреЗрдЬреЗрдВрдЧреЗред рд╕реА # рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
var sendTask = SendAsync(); var delayTask = Task.Delay(timeout); var task = await Task.WhenAny(sendTask, delayTask); if (task == delayTask) return Timeout;
рдпрд╣ рдХреЛрдб рд╣рдорд╛рд░реЗ рдЯрд╛рд╕реНрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЯрд╛рд╕реНрдХред рдЗрд╕рдХреЗ рдмрд╛рдж, Task.WhenAny рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдпрд╛ рддреЛ рд╣рдорд╛рд░реЗ рдЯрд╛рд╕реНрдХ рдпрд╛ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЯрд╛рд╕реНрдХред рдбреЗрд▓ рдХреЛ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдХреЛрдб, рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯрд╛рд╕реНрдХ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ SendAsync рдкрд╣рд▓реЗ рд▓реМрдЯ рдЖрдП, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорддрджрд╛рди рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реЗрдВрдЧреАред
1.2 рд▓рдВрдмреЗ рдорддрджрд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ
- рдмрдбрд╝реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ
- рдХрдИ рд╕рдорд╡рд░реНрддреА рдкреНрд░рд╢реНрди
- => рдЙрдЪреНрдЪ CPU рдЙрдкрдпреЛрдЧ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЙрдЪреНрдЪ рдЦрдкрдд рд╣реИред рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ 100% рдкрд░ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдХреБрдЫ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд╕рд╛рде рднрд░рд╛ рд╣реБрдЖ рд╣реИред
рдЬрдм рд╣рдордиреЗ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдореЗрдореЛрд░реА рдбрдВрдк рд╣рдЯрд╛ рджрд┐рдпрд╛:
~*e!clrstack System.Threading.Monitor.Enter(System.Object) System.Threading.TimerQueueTimer.Change(тАж) System.Threading.Timer.TimerSetup(тАж) System.Threading.Timer..ctor(тАж) System.Threading.Tasks.Task.Delay(тАж)
рдбрдВрдк рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ WinDbg рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рдордиреЗ рдПрдХ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬреЛ рд╕рднреА рдкреНрд░рдмрдВрдзрд┐рдд рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдзрд╛рдЧреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рд▓реЙрдХ рдкрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рд╡рд╣ рд╣реИ рдЬреЛ C # рдореЗрдВ рд▓реЙрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИред рдЗрд╕ рд▓реЙрдХ рдХреЛ рдЯрд╛рдЗрдорд░ рдФрд░ рдЯрд┐рдорд░рдХреНрдпреВрдпреВрдЯреАрдорд░ рдирд╛рдордХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рдХреИрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЯрд╛рдЗрдорд░ рдореЗрдВ, рд╣рдо рдЯрд╛рд╕реНрдХ рд╕реЗ рдЖрдП рдереЗред рддрдм рдЬрдм рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдЬрдм Task.Delay рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ TimerQueue рдХреЗ рдЕрдВрджрд░ рд▓реЙрдХ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
1.3 рддрд╛рд▓рд╛ рдХрд╛рдлрд┐рд▓рд╛
- рдХрдИ рдзрд╛рдЧреЗ рдПрдХ рддрд╛рд▓рд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ
- рд▓реЙрдХ рдХреЗ рддрд╣рдд, рдереЛрдбрд╝рд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╕рдордп рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдирд╣реАрдВред
- рдереНрд░реЗрдбрдмреНрд▓реЙрдХ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВ - рд╡реЗ рдЕрдирдВрдд рдирд╣реАрдВ рд╣реИрдВ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡реЗрджрди рдореЗрдВ рд▓реЙрдХ рдХрд╛рдлрд┐рд▓рд╛ рдерд╛ред рдХрдИ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЙрдХ рдХреЗ рддрд╣рдд, рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕рд╛рдзрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдкрд░ рд╣реА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЙрдХ рдкрд░ рдЖрдкрд╕ рдореЗрдВ рдереНрд░реЗрдб рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рдкрд░ред рдпрд╣ .NET рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ: рд▓реЙрдХ рдХрд╛рдлрд┐рд▓реЗ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдереНрд░реЗрдб рд╣реЛрддреЗ рд╣реИрдВред
рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдереНрд░реЗрдбреНрд╕ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рд╣реИред рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рдКрдкрд░реА рд╕реАрдорд╛ рд╣реИред рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рднреА рдереНрд░реЗрдбрдкреВрд▓ рдереНрд░реЗрдб рд▓реЙрдХ рдХрд╛рдлрд┐рд▓реЗ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗ, рдФрд░ рдереНрд░реЗрдбрдкреБрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдХреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рд╕реНрдерд┐рддрд┐ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИред
рез.рек рдЯрд┐рдорд░рдХреНрдпреВ
- рдХрд┐рд╕реА .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред
- рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдХрд╛рд░реНрдп
- рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- HttpClient
TimerQueue рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕рднреА рдЯрд╛рдЗрдорд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдмрд╛рд░ WinForms рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдП рд╣реЛрдВрдЧреЗред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдорд░ рдХреНрдпрд╛ рд╣реИрдВ: рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрд╛рд╕реНрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрд▓рдп (рдпрд╣ рд╕рд┐рд░реНрдл рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ), рдЙрдиреНрд╣реЗрдВ рдХреИрдВрд╕рд┐рд▓реЗрд╢рдирдЯреЛрдХрди рдХреЗ рдЕрдВрджрд░ рднреА рд░рджреНрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣реА рд╣реИ, рдЯрд╛рд╕реНрдХрдбреЗрд▓ рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЯрд╛рд╕реНрдХрд▓реЗрдиред рдХрд╛рдВрдХреЗрд▓реЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдЖрдВрддрд░рд┐рдХ .NET рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HttpClient рдореЗрдВред
рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, HttpClient рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЯрд╛рдЗрдорд░ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рд╕реНрдХ рд╢реБрд░реВ рди рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдк рдЕрднреА рднреА рд╡реИрд╕реЗ рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЯрд┐рдореЗрд░рдХреНрдпреВ рдХреЛ рдЕрдВрджрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп (рдкреНрд░рддрд┐-рдЕрдиреБрдЧрд╛рдореА):
- TimerQueueTimer рдХреА рдбрдмрд▓ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА
- рддрд╛рд▓рд╛ рд╡рд╕реНрддреБ - рдирд┐рдпрдорд┐рдд рдЯрд╛рдЗрдорд░ рдХреЙрд▓рдмреИрдХ
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЖрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛
- рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝рдирд╛: O (1) + рд▓реЙрдХ
- рдЯрд╛рдЗрдорд░ рд╣рдЯрд╛рдирд╛: O (1) + рд▓реЙрдХ
- рдкреНрд░рд╛рд░рдВрдн рдЯрд╛рдЗрдорд░: O (N) + рд▓реЙрдХ
TimerQueue рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдпрд╣ TimerQueueTimer рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рджреЛрд╣рд░реА рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реА рд╕реВрдЪреА рд╣реИред TimerQueueTimer рдореЗрдВ рдЕрдиреНрдп TimerQueueTimer рдХрд╛ рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдкрдбрд╝реЛрд╕реА, рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдорд░ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╕рдордп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдорд░ рдлрд╛рдпрд░ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЛ рд▓реЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд▓реЙрдХ рдХрд╛рдлрд┐рд▓рд╛ рд╣реБрдЖ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд┐рдорд░рдХреНрдпреВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд░реВрдЯреАрди рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЯрд╛рдЗрдорд░ рд╕реЗ рдмрдВрдзреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред
рдЯрд╛рдЗрдорд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХрд╛ рдЖрджреЗрд╢ рдирд╣реАрдВ рд╣реИ, рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирдП рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рд░реВрдЯреАрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рджреЛрд╣рд░реА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЙрди рдЯрд╛рдЗрдорд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдВ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдРрд╕реА рд╣реИред рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдкрд░ рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рдУ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдорд░ рдХреА рд╢реБрд░реБрдЖрдд рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдпреЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд┐рдорд░рдХреНрдпреВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЗрдорд╛рд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд░реВрдЯреАрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рд▓рдВрдмреЗ рд░реИрдЦрд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЙрд╕ рд╕рдордп рдЬреЛ рд▓реЛрдЧ рдЯрд┐рдорд░рдХреНрдпреВ рд╕реЗ рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд▓реЙрдХ рдХрд╛рдлрд┐рд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ .NET рдХреЛрд░ рдореЗрдВ рдареАрдХ рдХреА рдЧрдИ рд╣реИред
рдЯрд╛рдЗрдорд░ рд▓реЙрдХ рд╡рд┐рд╡рд╛рдж рдХреЛ рдХрдо рдХрд░реЗрдВ (coreclr # 14527)
- рддрд╛рд▓рд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХрд╛рдо
- рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯредрдкреНрд░реЛрд╕реЗрд╕рд░ Count TimerQueue's TimerQueueTimer - рдЫреЛрдЯреЗ / рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдорд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрддрд╛рд░реЗрдВ
- рд▓рдШреБ рдЯрд╛рдЗрдорд░: рд╕рдордп <= 1/3 рд╕реЗрдХрдВрдб
https://github.com/dotnet/coreclr/issues/14462
https://github.com/dotnet/coreclr/pull/14527
рдпрд╣ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдЙрдиреНрд╣реЛрдВрдиреЗ рдЯрд┐рдореЗрд░рдХреНрдпреВ рдкрд░ рдЫрд╛рдкрд╛ рдорд╛рд░рд╛: рдПрдХ рдЯрд┐рдорд░рдХреНрдпреВ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рдкреВрд░реЗ рдПрдкрдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдерд╛, рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдХрдИ рдЯрд┐рдорд░рдХреНрдпреВ рдХреЛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рдереНрд░реЗрдбреНрд╕ рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рдЯрд╛рдЗрдорд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЯрд╛рдЗрдорд░ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдПрдХ рд▓реЙрдХ рдкрд░ рдЯрдХрд░рд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛрдЧреАред
.NET рдХреЛрд░ рдореЗрдВ рднреА рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдПред рдЯрд╛рдЗрдорд░ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рдФрд░ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрд┐рдорд░рдХреНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдЯрд╛рдЗрдорд░ рдХреЛ рд╕реЗрдХрдВрдб рдХреЗ 1/3 рд╕реЗ рдХрдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред .NET рдХреЛрд░ рдореЗрдВ, рд╣рдо рдЯрд╛рдЗрдорд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗред
https://github.com/Microsoft/dotnet-framework-early-access/blob/master/release-notes/NET48/dotnet-48-changes.mdhttps://github.com/dotnet/coreclr/labels/netfx-port-considerрдпрд╣ рдлрд┐рдХреНрд╕ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ, рд╕рдВрд╕реНрдХрд░рдг 4.8 рдореЗрдВ рдмреИрдХрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Netfx-port-рдЧреМрд░ рдЯреИрдЧ рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк .NET рдХреЛрд░, CoreCLR, CoreFX рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдмреИрдХрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдм рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдкрдЪрд╛рд╕ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЦреБрд▓реЗ рд╕реНрд░реЛрдд .NET рдиреЗ рдмрд╣реБрдд рдорджрдж рдХреА, рдХрд╛рдлреА рдХреБрдЫ рдХреАрдбрд╝реЗ рддрдп рдХрд┐рдП рдЧрдП рдереЗред рдЖрдк рдЪреЗрдВрдЬрд▓реЙрдЧ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.8 рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рдлрд┐рдХреНрд╕ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрдиреНрдп .NET рд░рд┐рд▓реАрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.8 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реИред рдпрд╣ рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк App.config рдХрд╣рддреЗ рд╣реИрдВ
рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ App.config рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ UseNetCoreTimer рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.8 рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд▓реЙрдХ рдХрд╛рдлрд┐рд▓реЗ рдореЗрдВ рди рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Task.Delay рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рдореЗрдВ, рд╣рдордиреЗ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдХрд┐рд╕ рд╕рдордп рдЯрд╛рдЗрдорд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
1.5 рдЯрд╛рд╕реНрдХред рдбреЗрд▓рдп: рджреЗрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- BinaryHeap
- Sharding
- рдЗрд╕рдиреЗ рдорджрдж рдХреА, рд▓реЗрдХрд┐рди рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ
рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рд░реВрдЯреАрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдХреЙрд▓рдмреИрдХ рдХрд╣рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрддрд╛рд░ рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ рдЯрд╛рдЗрдорд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдмрд┐рдЧрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╣реАрдк рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ .NET рдбрдмрд▓ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдмрд╕ рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА, рд╣рдореЗрдВ рдЯрд┐рдорд░рдХреНрдпреВ рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕рднреА рд╕рдорд╛рди, рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рддрд╛рд▓рд╛ рдХрд╛рдлрд┐рд▓реЗ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рд╡реЗ рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ .NET рдХреЛрдб рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг 4.8 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ .NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдлрд┐рдХреНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рез.рем рдЯрд╛рд╕реНрдХрдбреЗрд▓ред рдирд┐рд╖реНрдХрд░реНрд╖: рдирд┐рд╖реНрдХрд░реНрд╖
- рд╣рд░ рдЬрдЧрд╣ рдиреБрдХрд╕рд╛рди - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдореЗрдВ рднреА
- рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- рдХреЛрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдкрд╣рд▓реЗ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (рдФрд░ рдирдП рдмрдЧ) :)
рдЗрд╕ рдкреВрд░реА рдХрд╣рд╛рдиреА рд╕реЗ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓рддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдиреБрдХрд╕рд╛рди рд╣рд░ рдЬрдЧрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рднреА рдЬреЛ рдЖрдк рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рд╣рд░ рджрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдХрд╛рд░реНрдп, рдЯрд╛рд╕реНрдХред
рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рдордиреЗ рд╕рд┐рд░реНрдл рд▓реЛрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЪрд░рдг рдореЗрдВ рдкрд╣рдЪрд╛рдиреАред рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдкрд░ рдХрдИ рдмрд╛рд░ рд╢реВрдЯ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдиреЗ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдордп рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред
.NET рдХреЛрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ - рдЖрдк рдмрдЧ рдлрд┐рдХреНрд╕ (рдФрд░ рдирдП рдмрдЧ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдВрдЧреЗред рдирдП рдмрдЧ рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛рдБ?
рдЯрд╛рдЗрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рд╣рдо рдЕрдЧрд▓реЗ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдХрд╣рд╛рдиреА реи: рд╕реЗрдордлреЛрд░рд╕реНрд▓реАрдо
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╣рд╛рдиреА рдкреНрд░рд╕рд┐рджреНрдз рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓реАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
2.1 рд╕рд░реНрд╡рд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ
- рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдорд╡рд░реНрддреА рд╕рдВрд╕рд╛рдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдЖрдк рд╢рд╛рдпрдж рд╕реАрдкреАрдпреВ рдкрд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ: рдЬрдм рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд╝реНрдпрд╛рджрд╛ рдЧрд░рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдардВрдбрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдпрд╣рд╛рдБ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧрд┐рд░ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдРрд╕рд╛ рдХрд░реЗрдВ рдХрд┐ рдпрджрд┐ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдз рдЖрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдХрддрд╛рд░рдмрджреНрдз рд╣реЛ рдЬрд╛рдПрдВ рдФрд░ рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдЖрдП рдереЗред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬреЗрд╢рди рдЖрджрд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕реЗрдорд╛рдлреЛрд░ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдо рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдПрди рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЬреЛ рдПрди + рдлрд░реНрд╕реНрдЯ рдЖрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЙрд╕ рдкрд░ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЬреЛ рдкрд╣рд▓реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЧрдП рдереЗ рд╡реЗ рд╕реЗрдорд╛рдлреЛрд░ рд░рд┐рд▓реАрдЬ рдХрд░ рджреЗрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ: рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреЛ рдзрд╛рдЧреЗ, рджреЛ рд╢реНрд░рдорд┐рдХ рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рддрд╣рдд рдЪрд▓реЗ рдЧрдП, рдмрд╛рдХреА рд▓рд╛рдЗрди рдореЗрдВ рдЦрдбрд╝реЗ рдереЗред

рдмреЗрд╢рдХ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╕реЗрдорд╛рдлреЛрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ .NET рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕реЗрдордлреЛрд░рд╕реНрд▓реАрдо рд▓рд┐рдпрд╛ рдФрд░ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛:
var semaphore = new SemaphoreSlim(N); тАж await semaphore.WaitAsync(); await HandleRequestAsync(request); semaphore.Release();
рд╣рдо рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рддрд╣рдд рд╣рдо рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕реЗрдорд╛рдлреЛрд░ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХрд╛ рдПрдХ рдЖрджрд░реНрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рдпрд╣ рдЕрдм рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
2.2 рд╕рд░реНрд╡рд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ: рдЬрдЯрд┐рд▓рддрд╛
- LIFO рдЖрджреЗрд╢ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдз
- SemaphoreSlim
- ConcurrentStack
- TaskCompletionSource
рд╣рдо рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреВрд▓ рдЧрдПред рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╡рд╛рд╕реНрддрд╡рд┐рдХ http рдЕрдиреБрд░реЛрдз рд╣реИрдВред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдордпрдмрд╛рд╣реНрдп рд╣реИ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднреЗрдЬрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рд╕рдордп рдХреЗ рдмрд╛рдж F5 рджрдмрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдорд╛рдлреЛрд░ рдХреА рддрд░рд╣, рдХрддрд╛рд░ рдХреНрд░рдо рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрддрд╛рд░ рд╕реЗ рдЙрди рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдХ рдСрд░реНрдбрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдЙрди рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ рдЬреЛ рдмрд╣реБрдд рдЕрдВрддрд┐рдо рд╕рдордп рдореЗрдВ рдЖрдП, рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧреАред
рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓реАрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЗрд╕ рд╕рдм рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдирдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯрд╕реНрдЯреИрдХ, рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реНрд░реЛрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХреЗ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдереАред TaskCompletionSource рдПрдХ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ, рдЬреЛ рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдЯреЗрдирд╕реЗрди рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдПред рдЖрдк TaskCompletionSource рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдЯрд╛рд╕реНрдХ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ TaskCompletionSource рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ред
рд╣рдо рд╕рднреА рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдХреЛрдб рднрдпрд╛рдирдХ рд╣реИред рдФрд░, рд╕рдмрд╕реЗ рдмреБрд░рд╛, рдпрд╣ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рднрд╛рд░реА рд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдХреБрдЫ рдорд╣реАрдиреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд╣реА, рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдмрдврд╝рдХрд░ 100% рд╣реЛ рдЧрдИ рд╣реИред рд╣рдордиреЗ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛, рдбрдВрдк рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рд╡рд┐рдирдбрдмрдЧ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓реЙрдХ рдХрд╛рдлрд┐рд▓рд╛ рдорд┐рд▓рд╛ред

рдЗрд╕ рдмрд╛рд░ рд▓реЙрдХ рдХрд╛рдлрд┐рд▓рд╛ рд╕реЗрдордлреЛрд░рд╕реНрд▓рд╛рдЗрдо.рд╡реЗрд▓рд┐рдЯреНрд╕рд╕реБрдВрдХ рдФрд░ рд╕реЗрдордлреЛрд░рд╕реНрд▓реАрдо.рд▓реАрдЬ рдХреЗ рдЕрдВрджрд░ рд╣реБрдЖред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕реЗрдордлреЛрд░рд╕реНрд▓реАрдо рдХреЗ рдЕрдВрджрд░ рдПрдХ рддрд╛рд▓рд╛ рд╣реИ, рдпрд╣ рд▓реЙрдХ-рдлреНрд░реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдереАред

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

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕реЗрдореАрдлреЛрд░ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рддреБрд░рдВрдд рд▓реЙрдХ-рдлреНрд░реА рд╣реЛрдЧрд╛ рдФрд░ рдЬреЛ рддреБрд░рдВрдд рд╕реНрдЯреИрдХ рдСрд░реНрдбрд░ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдирдВрдмрд░ рдХрд░реЗрдВрдЯ-рдХреЙрдЙрдВрдЯ рд╣реЛрдЧрд╛ - рдпрд╣ рд╣реИ рдХрд┐ рд╕реЗрдордлреЛрд░ рдореЗрдВ рдХрд┐рддрдиреЗ рдФрд░ рд╕реНрдерд╛рди рдмрдЪреЗ рд╣реИрдВред рдпрджрд┐ рд╕реЗрдорд╛рдлреЛрд░ рдореЗрдВ рд╕реАрдЯреЗрдВ рдирд╣реАрдВ рдмрдЪреА рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдЧреА рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рдПрдЧреА рдХрд┐ рдХрд┐рддрдиреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрддрд╛рд░ рдореЗрдВ рд╣реИрдВред рдПрдХ рд╕рдорд╡рд░реНрддреА рд╕реНрдЯрд╛реЕрдХ рднреА рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рдирд╕реНрд░реЛрд╕реЛрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ - рдпрд╣ рд╡реЗрдЯрд░'рдУрд╡ рдХрд╛ рдПрдХ рд╕реНрдЯреИрдХ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд▓рд┐рдП WaitAsync рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
var decrementedCount = Interlocked.Decrement(ref currentCount); if (decrementedCount >= 0) return Task.CompletedTask; var waiter = new TaskCompletionSource<bool>(); waiters.Push(waiter); return waiter.Task;
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдиреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдлреНрдд рд╕реНрдерд╛рди рдереЗ, рдФрд░ рдлрд┐рд░ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ: "рдпрд╣ рдмрд╛рдд рд╣реИ, рдЖрдк рд╕реЗрдореАрдлреЛрд░ рдХреЗ рддрд╣рдд рдЧрдП рдереЗ"ред
рдпрджрд┐ рд╕реЗрдордлреЛрд░ рдореЗрдВ рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рдереА, рддреЛ рд╣рдо рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реНрд░реЛрдд рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡реЗрдЯрд░'рдУрд╡ рдХреЗ рдвреЗрд░ рдкрд░ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рд╕реНрдХ рдХреЛ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрддреЗ рд╣реИрдВред рд╕рдордп рдЖрдиреЗ рдкрд░, рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЕрдкрдирд╛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦ рд╕рдХреЗрдЧрд╛ рдФрд░ рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рдЕрдзреАрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рд╣рдо рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
var countBefore = Interlocked.Increment(ref currentCount) - 1; if (countBefore < 0) { if (waiters.TryPop(out var waiter)) waiter.TrySetResult(true); }
рд░рд┐рд▓реАрдЬ рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд╕реЗрдорд╛рдлреЛрд░ рдореЗрдВ рдПрдХ рд╕реАрдЯ
- рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рдХрд░рдВрдЯ
рдпрджрд┐ рд╣рдо currentCount рджреНрд╡рд╛рд░рд╛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрджрд░ рд╡реЗрдЯрд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдРрд╕реЗ рд╡реЗрдЯрд░ рдХреЛ рд╕реНрдЯреИрдХ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╡реЗрдЯрд░ рдПрдХ TaskCompletionSource рд╣реИред рдЗрд╕ рдХреЛрдб рдкрд░ рд╕рд╡рд╛рд▓: рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ? рдирд┐рд░рдВрддрд░рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИ, рдЬрд╣рд╛рдВ 'TaskCompletionSource'y' рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдордиреЗ рдПрдХ TaskCompletionSource рдмрдирд╛рдпрд╛ рдФрд░ рджреЛ рдЯрд╛рд╕реНрдХ рд▓реЙрдиреНрдЪ рдХрд┐рдПред рдкрд╣рд▓рд╛ рдЯрд╛рд╕реНрдХ рдПрдХ рдпреВрдирд┐рдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реНрд░реЛрдд рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рдбреНрдпреВрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдЯрд╛рд╕реНрдХ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реЛрд░реНрд╕ рдкрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЯрд╛рд╕реНрдХ рдкрд░, рдФрд░ рдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдЗрд╕рдХреЗ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд╕рдВрдХрд▓рди рдореЗрдВ рдЯрд╛рд╕реНрдХ 2 рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рдереНрд░реЗрдб рд╣реИред рдереНрд░реЗрдбред рд╕реЛрд▓реЗрдкред TaskCompletionSource рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдирд┐рд░рдВрддрд░рддрд╛ рдЙрд╕реА рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреА рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрджрдиреБрд╕рд╛рд░, рдкрд╣рд▓реЗ рдЯрд╛рд╕реНрдХ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЗ рдбреНрдпреВрд╕ рдХреЛ рдЕрдм рдореБрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЕрдЧрд░ рдореИрдВрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрдВрд╕реЛрд▓ рдпреВрдирд┐рдЯ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛, рддреЛ рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдкрд░ рдирд┐рд░рдВрддрд░рддрд╛ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рдФрд░ рдбреНрдпреВрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЬрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдПрдХ рд╣реА рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЬрд┐рд╕рдореЗрдВ - рдереНрд░реЗрдб рдкреВрд▓ рдХреЛ рдорд┐рд▓реЗрдЧрд╛ - рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрдиред
var tcs = new TaskCompletionSource<bool>( TaskCreationOptions.RunContinuationsAsynchronously); Task.Run(() => tcs.TrySetResult(true));
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╛ рддреЛ рд╕рдВрдмрдВрдзрд┐рдд RunContinuationsAsynchronously рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рд╕реНрдХрдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реНрд░реЛрдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЯрд╛рд╕реНрдХ рдХреЗ рдЕрдВрджрд░ TrySetResult рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Run/ThreadPool.QueueUserWebItem рддрд╛рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдзрд╛рдЧреЗ рдкрд░ рди рдЪрд▓реЗред рдпрджрд┐ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдзрд╛рдЧреЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╡рд╛рдВрдЫрд┐рдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред

WaitAsync рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЙрд╕реЗ рдмрд╕ рдЗрддрдирд╛ рдЕрд╕рдВрднрд╡ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣рд╛рдВ рдПрдХ рджреМрдбрд╝ рд╣реИред

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ WaitAsync рд╡рд┐рдзрд┐ рдореЗрдВ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реЗ рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕реНрдЯреИрдХ рдкрд░ рд╡реЗрдЯрд░ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрдореА рдФрд░ рдзрдХреНрдХрд╛ рдХреЗ рдмреАрдЪ рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рднреА рди рдЦреАрдВрдЪреЗред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕реНрдЯреИрдХ рдкрд░ рд╡реЗрдЯрд░ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
var countBefore = Interlocked.Increment(ref currentCount) - 1; if (countBefore < 0) { Waiter waiter; var spinner = new SpinWait(); while (!waiter.TryPop(out waiter)) spinner.SpinOnce(); waiter.TrySetResult(true); }
рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рд▓реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддреЗред рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рд▓реВрдк рдореЗрдВ рд╕реНрдкрд┐рди рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рд╡реЗрдЯрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛, рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдзрд╛рдЧрд╛ рдереНрд░реЗрдб рд╕реЛ рдЬрд╛рдПрдЧрд╛ред рддрд╛рдХрд┐ рд╕реАрдкреАрдпреВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, LIFO- рдСрд░реНрдбрд░ рд╕реЗрдорд╛рдлреЛрд░ рдХреЗрд╡рд▓ рд╣рдорд╛рд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
LowLevelLifoSemaphore
- рдПрдХ рд╕рдордп рдХрд╛
- рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ IO рдХрдореНрдкреЗрдХреНрд╢рди рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.cs
.NET рдореЗрдВ рд╣реА рдРрд╕рд╛ рд╕реЗрдорд╛рдлреЛрд░ рд╣реИ, рд▓реЗрдХрд┐рди CoreCLR рдореЗрдВ рдирд╣реАрдВ, CoreFX рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ CoreRT рдореЗрдВред рдпрд╣ рдХрднреА-рдХрднреА .NET рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реИред рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЛрд╡реЗрд▓рд╡реЗрд▓рд┐рдлреЛрд╕реЗрдорд╛рдлреЛрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдорд╛рдлреЛрд░ рд╣рдореЗрдВ рд╡реИрд╕реЗ рднреА рд╕реВрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИред
рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ, рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдпрд╣ IO рдХрдореНрдкреНрд▓реАрд╢рди рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдХрд┐ рдзрд╛рдЧреЗ рдЙрди рдкрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпреЗ рдзрд╛рдЧреЗ рд╕рд┐рд░реНрдл рдПрд▓рдЖрдИрдПрдлрдУ рдХреЗ рдЖрджреЗрд╢ рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЛрд╡реЗрд▓ рд╣реИред
2.3 рдирд┐рд╖реНрдХрд░реНрд╖:
- рдЙрдореНрдореАрдж рди рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓реЛрдб рдХреЗ рддрд╣рдд рдврд╛рдВрдЪреЗ рдХреЛ рднрд░рдирд╛ рдмрдЪ рдЬрд╛рдПрдЧрд╛
- рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
- рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрд╢рд╛ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
- рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ
рдЗрд╕ рдкреВрд░реА рдХрд╣рд╛рдиреА рд╕реЗ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓рддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрд╢рд╛ рди рдХрд░реЗрдВ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд░реВрдкрд░реЗрдЦрд╛ рд╕реЗ рдХреБрдЫ рдХрдХреНрд╖рд╛рдПрдВ рдЖрдкрдХреЗ рднрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреАред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓рд┐рдо рдЦрд░рд╛рдм рд╣реИ, рдпрд╣ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИред
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕реЗрдореАрдлреЛрд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓рд┐рдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИред
рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
.NET , тАФ . lock, : ┬л ?┬╗ CPU 100%, lock', , , - .NET. .
.
3: (A)sync IO
/, .

lock convoy, stack trace Overlapped PinnableBufferCache. lock. : Overlapped PinnableBufferCache?
OVERLAPPED тАФ Windows, /. , . , . , lock convoy. , lock convoy, , .

, , .NET 4.5.1 4.5.2. .NET 4.5.2, , .NET 4.5.2. .NET 4.5.1 OverlappedDataCache, Overlapped тАФ , , . , lock-free, ConcurrentStack, . .NET 4.5.2 : OverlappedDataCache PinnableBufferCache.
? PinnableBufferCache , Overlapped , , тАФ . , , . PinnableBufferCache . , lock-free, ConcurrentStack. , . , , - lock-free list lock'.
3.1 PinnableBufferCache
LockConvoy:
lock convoy , - . list , lock , , .
PinnableBufferCache , . :
PinnableBufferCache_System.ThreadingOverlappedData_MinCount
, . : ┬л ! - ┬╗. -:
Environment.SetEnvironmentVariable( "PinnableBufferCache_System.Threading.OverlappedData_MinCount", "10000"); new Overlapped().GetHashCode(); for (int i = 0; i < 3; i++) GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
? , Overlapped , , . , , , , PinnableBufferCache lock convoy'. , .
.NET Core PinnableBufferCache
, OverlappedData . , , Garbage collector , . .NET Core . .NET Framework, , .
3.2 :
, . , .NET , . , , .NET Core. , , -.
key-value .
4: Concurrent key-value collections
.NET concurrent-. lock-free ConcurrentStack ConcurrentQueu, . ConcurrentDictionary, . lock-free , , . ConcurrentDictionary?
4.1 ConcurrentDictionary
:
рдкреЗрд╢реЗрд╡рд░реЛрдВ:
- (TryAdd/TryUpdate/AddOrUpdate)
- Lock-free
- Lock-free enumeration
, memory-, , . , , .NET Framework. . , , (enumeration) lock-free. , .
, , - .NET. key-value - :

-, bucket'. bucket', . , bucket , .
тАФ , ConcurrentDictionary. ConcurrentDictionary ┬л-┬╗ . , , , memory traffic. ConcurrentDictionary, lock'. тАФ .
, Dictionary.

Dictionary , Concurrent, . : buckets, entries. buckets bucket' entries. ┬л-┬╗ entries. . ┬л-┬╗ int, bucket'.
memory overhead, ConcurrentDictionary Dictionary.

Dictionary. Memory overhea' , . Dictionary overhead - , int'. 8 .
ConcurrentDictionary. ConcurrentDictionary ConcurrentDictionary.Node. , . int hashCode . , table ( 16 ), int hashCode . , 64- 28 overhead'. Dictionary.
memory overhead', ConcurrentDictionary GC , . Benchmark. ConcurrentDictionary , GC.Collect. ?

. ConcurrentDictionary 10 , , , . Dictionary . , , , . .
, ConcurrentDictionary?
4.2
- TTL
- Dictionary+lock
- Sharding
. ConcurrentDictionary. 10 . , . TTL , . Dictionary lock'. , , lock . Dictionary lock' , - , lock. , .
4.3
- in-memory <Guid,Guid>
- >10 6
. тАФ , in-memory Guid' Guid, . . - - , . , 15 . . Semaphore ConcurrentDictionary.

, lock-free , overhead GC. , . , , , . , - , , . , , Large Object Heap. ?
, , Dictionary .

Dictionary bucket', Entry. Entry , , , .

Dictionary , , . , - .
, - ? -, , , , . . Dictionary, , buckets, entries, Interlocked. , .
Dictionary
- ,
- , ?
тАФ Resize buckets entries
тАФ -
тАФ Dictionary.Entry
тАФ -
https://blogs.msdn.microsoft.com/tess/2009/12/21/high-cpu-in-net-app-using-a-static-generic-dictionary/
, Dictionary - bucket'. , . , , . , , .
Entry Dictionary. - - . , .

.NET Framework 1.1. Hashtable, Dictionary, object'. MSDN , . , -. . , Hashtable . , .
4.4 Dictionary.Entry

? Dictionary.Entry , , 8 , , , , . ?
bool writing; int version; this.writing = true; buckets[index] = тАж; this.version++; this.writing = false;
: ( , ) int-. , . , , , , .
bool writing; int version; while (true) { int version = this.version; bucket = bickets[index]; if (this.writing || version != this.version) continue; break; }
, , . , . , 8 .
4.5 -
, .

Dictionary bucket , .
Dictionary, . : 0 2. bucket, 1 2. ? 0. , , 2. . , 2, , , 1. 1 2 тАФ bucket. , , . 1 тАФ , bucket. Hashtable , bucket' -. тАФ
double hashing .
4.6
. , Buckets, Entries ( Buckets, Entries). - , , , , .
. , .
: , , , , . , , .

, , тАФ .
? , - 2. - Capacity , . тАФ 2. , . 2. ? , , , . - , , 3. , , , , , .
, Hashtable, . , double hashing. , , , .
, , тАФ , . Hashtable. , тАФ тАФ . . , bucket', - , . .
, , lock-free LOH.

lock-free ? MSDN Hashtable , . , , .

, , , bucket'. Dictionary bucket', -, bucket' . - bucket, bucket . , .
, Large Object Heap.

. CustomDictionary CustomDictionarySegment . Dictionary, , . тАФ Dictionary, . , Large Object Heap. , bucket' . , , , bucket, - - .
. ConcurrentDictionary, .NET, , .
4.7
? .NET . . , , . - тАФ - . , , , .
- , , , , . , , , , , . тАФ , , .
тАФ ConcurrentDictionary. , , (
Diafilm ), .
GitHub. тАФ , , LIFO-Semaphore, . , .
6-7 DotNext 2019 Moscow ┬л.NET: ┬╗ , .NET Framework .NET Core, , .