.NET: рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩ рд░ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгрд╣рд░реВред рднрд╛рдЧ 1

рдо рдореВрд▓ рд▓реЗрдЦ Habr рдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрджреИрдЫреБ, рдЬрд╕рдХреЛ рдЕрдиреБрд╡рд╛рдж рдХрд░реНрдкреЛрд░реЗрдЯ рдорд╛ рдкреЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рдмреНрд▓рдЧ рдкреЛрд╖реНрдЯ.

рдпрд╣рд╛рдБ рд░ рдЕрд╣рд┐рд▓реЗ рдирддрд┐рдЬрд╛рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирдЧрд░реА, рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд░реВрдкрдорд╛ рдХреЗрд╣рд┐ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд╡рд╛ рдпреЛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреЗ рдзреЗрд░реИ рдПрдХрд╛рдЗрд╣рд░реВ рдмреАрдЪ рдареВрд▓реЛ рдХрд╛рдо рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрди, рдХрдореНрдкреНрдпреБрдЯрд░рдХреЛ рдЖрдЧрдорди рдЕрдШрд┐ рдЕрд╡рд╕реНрдерд┐рдд рдерд┐рдпреЛред рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрдЧрдорди рд╕рдВрдЧ, рдпреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдзреЗрд░реИ рдореВрд░реНрдд рднрдпреЛред рдЕрдм, 2019 рдорд╛, рдо рдпреЛ рд▓реЗрдЦ 8-рдХреЛрд░ рдЗрдиреНрдЯреЗрд▓ рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░рдХреЛ рд╕рд╛рде рд▓реНрдпрд╛рдкрдЯрдкрдорд╛ рдЯрд╛рдЗрдк рдЧрд░реНрджреИрдЫреБ, рдЬрд╕рдорд╛ рдПрдХ рд╕рдп рднрдиреНрджрд╛ рдмрдвреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рдорд╛рдирд╛рдиреНрддрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХрд╛ рдЫрдиреН, рд░ рдЕрдЭ рдзреЗрд░реИ рдереНрд░реЗрдбрд╣рд░реВред рдирдЬрд┐рдХреИ, рддреНрдпрд╣рд╛рдБ рдПрдХ рдереЛрд░реИ рдЬрд░реНрдЬрд░ рдлреЛрди рдЫ, рдХреЗрд╣рд┐ рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ рдХрд┐рдиреЗрдХреЛ, рдпрд╕рдорд╛ рдмреЛрд░реНрдбрдорд╛ 8-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЫред рд╡рд┐рд╖рдпрдЧрдд рд╕реНрд░реЛрддрд╣рд░реВ рд▓реЗрдЦ рд░ рднрд┐рдбрд┐рдпреЛрд╣рд░реВрд▓реЗ рднрд░рд┐рдПрдХрд╛ рдЫрдиреН рдЬрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рд▓реЗрдЦрдХрд╣рд░реВрд▓реЗ 16-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗ рдпрд╕ рд╡рд░реНрд╖рдХреЛ рдлреНрд▓реНрдпрд╛рдЧрд╢рд┐рдк рд╕реНрдорд╛рд░реНрдЯрдлреЛрдирд╣рд░реВрдХреЛ рдкреНрд░рд╢рдВрд╕рд╛ рдЧрд░реНрдЫрдиреНред MS Azure рд▓реЗ 20 рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░ 128 TB RAM рдХреЛ $2/рдШрдгреНрдЯрд╛ рднрдиреНрджрд╛ рдХрдордорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрдБрдЫред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдереНрд░реЗрдбрд╣рд░реВрдХреЛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХреНрд╖рдо рдирднрдПрд╕рдореНрдо рдЕрдзрд┐рдХрддрдо рдирд┐рдХрд╛рд▓реНрди рд░ рдпреЛ рд╢рдХреНрддрд┐рдХреЛ рджреЛрд╣рди рдЧрд░реНрди рдЕрд╕рдореНрднрд╡ рдЫред

рдЯрд░реНрдорд┐рдирд▓рдЬреА

рдкреНрд░рдХреНрд░рд┐рдпрд╛ - OS рд╡рд╕реНрддреБ, рдкреГрдердХ рдареЗрдЧрд╛рдирд╛ рдард╛рдЙрдБ, рдереНрд░реЗрдбрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред
рдереНрд░реЗрдб - рдПрдХ OS рд╡рд╕реНрддреБ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд╛рдиреЛ рдПрдХрд╛рдЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдЕрдВрд╢, рдереНрд░реЗрдбрд╣рд░реВрд▓реЗ рдореЗрдореЛрд░реА рд░ рдЕрдиреНрдп рд╕реНрд░реЛрддрд╣рд░реВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднрд┐рддреНрд░ рдЖрдкрд╕рдорд╛ рд╕рд╛рдЭрд╛ рдЧрд░реНрджрдЫред
рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ - OS рдЧреБрдг, рдПрдХреИ рд╕рд╛рде рдзреЗрд░реИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗ рдХреНрд╖рдорддрд╛
рдмрд╣реБ-рдХреЛрд░ - рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдПрдХ рдЧреБрдг, рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреА рдзреЗрд░реИ рдХреЛрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛
рдмрд╣реБрдкреНрд░рд╢реЛрдзрди - рдХрдореНрдкреНрдпреВрдЯрд░ рдХреЛ рдПрдХ рдЧреБрдг, рдПрдХреИ рд╕рд╛рде рдзреЗрд░реИ рдкреНрд░реЛрд╕реЗрд╕рд░рд╣рд░реБ рд╕рдВрдЧ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛
рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩ - рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдЧреБрдг, рдзреЗрд░реИ рдереНрд░реЗрдбрд╣рд░реВ рдмреАрдЪ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╡рд┐рддрд░рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ред
рд╕рдорд╛рдирд╛рдиреНрддрд░рддрд╛ - рд╕рдордпрдХреЛ рдкреНрд░рддрд┐ рдПрдХрд╛рдЗ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдкрдорд╛ рдзреЗрд░реИ рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджреИ
рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреА - рдпрд╕ рдкреНрд░рд╢реЛрдзрдирдХреЛ рдкреВрд░рд╛ рд╣реБрдиреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирдЧрд░реА рдЕрдкрд░реЗрд╢рдирдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди; рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдирддрд┐рдЬрд╛ рдкрдЫрд┐ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд░реВрдкрдХ

рд╕рдмреИ рдкрд░рд┐рднрд╛рд╖рд╛рд╣рд░реВ рд░рд╛рдореНрд░рд╛ рдЫреИрдирдиреН рд░ рдХреЗрд╣реАрд▓рд╛рдИ рдердк рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдо рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдкрдорд╛ рдкрд░рд┐рдЪрдп рдЧрд░рд┐рдПрдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реАрдорд╛ рдирд╛рд╢реНрддрд╛ рдкрдХрд╛рдЙрдиреЗ рдмрд╛рд░реЗ рдПрдЙрдЯрд╛ рд░реВрдкрдХ рдердкреНрдиреЗрдЫреБред рдпрд╕ рд░реВрдкрдХрдорд╛ рдирд╛рд╢реНрддрд╛ рдкрдХрд╛рдЙрдиреБ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛред

рдмрд┐рд╣рд╛рдирдХреЛ рдЦрд╛рдЬрд╛ рдмрдирд╛рдЙрдБрджреИ рдЧрд░реНрджрд╛ рдо (CPUрдо рднрд╛рдиреНрд╕рд╛рдорд╛ рдЖрдЙрдЫреБ (рдХрдореНрдкреНрдпреБрдЯрд░)ред рдорд╕рдБрдЧ реи рд╣рд╛рдд рдЫрдиреН (рдХреЛрд░)ред рднрд╛рдиреНрд╕рд╛рдорд╛ рдзреЗрд░реИ рдпрдиреНрддреНрд░рд╣рд░реВ рдЫрдиреН (IOрдУрднрди, рдХреЗрддрд▓реА, рдЯреЛрд╕реНрдЯрд░, рдлреНрд░рд┐рдЬред рдо рдЧреНрдпрд╛рд╕ рдЦреЛрд▓реНрдЫреБ, рдпрд╕рдорд╛ рдлреНрд░рд╛рдЗрдЩ рдкреНрдпрд╛рди рд░рд╛рдЦреНрдЫреБ рд░ рдпрд╕рд▓рд╛рдИ рддрд╛рддреЗрдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирдЧрд░реА рдпрд╕рдорд╛ рддреЗрд▓ рд╣рд╛рд▓реНрдЫреБ (рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд░реВрдкрдорд╛, рдирди-рдмреНрд▓рдХрд┐рдЩ-рдЖрдИрдУ-рд╡реЗрдЯрдо рдлреНрд░рд┐рдЬрдмрд╛рдЯ рдЕрдгреНрдбрд╛ рдирд┐рдХрд╛рд▓реНрдЫреБ рд░ рдкреНрд▓реЗрдЯрдорд╛ рднрд╛рдБрдЪреНрдЫреБ, рддреНрдпрд╕рдкрдЫрд┐ рдПрдЙрдЯрд╛ рд╣рд╛рддрд▓реЗ рдкрд┐рдЯреНрдЫреБ (рдереНрд░реЗрдб # 1), рд░ рджреЛрд╕реНрд░реЛ (рдереНрд░реЗрдб # 2) рдкреНрд▓реЗрдЯ рд╕рдорд╛рддреНрджреИ (рд╕рд╛рдЭрд╛ рд╕реНрд░реЛрдд)ред рдЕрдм рдо рдХреЗрддрд▓реА рдЦреЛрд▓реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рддрд░ рдорд╕рдБрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╣рд╛рдд рдЫреИрди (рдереНрд░реЗрдб рднреЛрдХрдорд░реА) рдпрд╕ рд╕рдордпрдорд╛, рдлреНрд░рд╛рдЗрдЩ рдкреНрдпрд╛рди рддрд╛рддреЛ рд╣реБрдиреНрдЫ (рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджреИ) рдЬрд╕рдорд╛ рдореИрд▓реЗ рдХреЛрд░реЗрдХреЛ рдХреБрд░рд╛ рдЦрдиреНрдпрд╛рдЙрдЫреБред рдо рдХреЗрддрд▓реАрдорд╛ рдкреБрдЧреНрдЫреБ рд░ рдпрд╕рд▓рд╛рдИ рдЦреЛрд▓реНрдЫреБ рд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрд╡рдХ рдпрд╕рдорд╛ рдкрд╛рдиреА рдЙрдореНрд▓рд┐рд░рд╣реЗрдХреЛ рд╣реЗрд░реНрдЫреБ (рдЕрд╡рд░реБрджреНрдз-IO- рдкреНрд░рддреАрдХреНрд╖рд╛), рдпрджреНрдпрдкрд┐ рдпрд╕ рд╕рдордпрдорд╛ рдЙрд╕рд▓реЗ рдУрдорд▓реЗрдЯ рдХреЛрд░реЗрдХреЛ рдкреНрд▓реЗрдЯрд▓рд╛рдИ рдзреБрди рд╕рдХреНрдереЗред

рдореИрд▓реЗ 2 рд╣рд╛рдд рдорд╛рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдУрдорд▓реЗрдЯ рдкрдХрд╛рдПрдХреЛ рдЫреБ, рд░ рдорд╕рдБрдЧ рдзреЗрд░реИ рдЫреИрди, рддрд░ рдПрдХреИ рд╕рдордпрдорд╛, рдУрдорд▓реЗрдЯ рдХреЛрд░реНрд░рд╛ рдЧрд░реНрдиреЗ рдХреНрд╖рдгрдорд╛, 3 рдХрд╛рд░реНрдпрд╣рд░реВ рдПрдХреИрдЪреЛрдЯрд┐ рднрдпреЛ: рдУрдореЗрд▓реЗрдЯ рдХреЛрд░реНрд░рд╛, рдкреНрд▓реЗрдЯ рд╕рдорд╛рддреЗрд░, рдлреНрд░рд╛рдЗрдЩ рдкреНрдпрд╛рди рддрддрд╛рдЙрдиреЗред CPU рдХрдореНрдкреНрдпреВрдЯрд░рдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рднрд╛рдЧ рд╣реЛ, IO рднрдиреЗрдХреЛ рдкреНрд░рд╛рдп рдЬрд╕реЛ рд╕рдмреИ рдХреБрд░рд╛ рд╕реБрд╕реНрдд рд╣реБрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдЕрдХреНрд╕рд░ рдПрдХ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд╕рдорд╛рдзрд╛рди рднрдиреЗрдХреЛ IO рдмрд╛рдЯ рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрд╛ CPU рд▓рд╛рдИ рдХреБрдиреИ рдЪреАрдЬрдХреЛ рд╕рд╛рде рдХрдмреНрдЬрд╛ рдЧрд░реНрдиреБ рд╣реЛред

рд░реВрдкрдХрд▓рд╛рдИ рдирд┐рд░рдиреНрддрд░рддрд╛ рджрд┐рдБрджреИ:

  • рдпрджрд┐ рдУрдорд▓реЗрдЯ рддрдпрд╛рд░ рдЧрд░реНрдиреЗ рдХреНрд░рдордорд╛, рдо рдкрдирд┐ рд▓реБрдЧрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреБ, рдпреЛ рдмрд╣реБрдХрд╛рд░реНрдпрдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реБрдиреЗрдЫред рдПрдЙрдЯрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╕реВрдХреНрд╖реНрдорддрд╛: рдХрдореНрдкреНрдпреБрдЯрд░рд╣рд░реВ рдорд╛рдирд┐рд╕рд╣рд░реВ рднрдиреНрджрд╛ рдпрд╕рдорд╛ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫрдиреНред
  • рдзреЗрд░реИ рд╢реЗрдлрд╣рд░реВ рднрдПрдХреЛ рднрд╛рдиреНрд╕рд╛, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рд░реЗрд╕реНрдЯреБрд░реЗрдиреНрдЯрдорд╛ - рдПрдХ рдмрд╣реБ-рдХреЛрд░ рдХрдореНрдкреНрдпреБрдЯрд░ред
  • рдПрдХ рд╢рдкрд┐рдВрдЧ рд╕реЗрдиреНрдЯрд░ рдорд╛ рдПрдХ рдЦрд╛рдирд╛ рдЕрджрд╛рд▓рдд рдорд╛ рдзреЗрд░реИ рд░реЗрд╕реНрдЯреБрд░реЗрдиреНрдЯ - рдбрд╛рдЯрд╛ рдХреЗрдиреНрджреНрд░

.NET рдЙрдкрдХрд░рдгрд╣рд░реВ

.NET рдзреЗрд░реИ рдЕрдиреНрдп рдЪреАрдЬрд╣рд░реВрд╕рдБрдЧ рдЬрд╕реНрддреИ рдереНрд░реЗрдбрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рдЫред рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде, рдпрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдердк рд░ рдердк рдирдпрд╛рдБ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкрд░рд┐рдЪрдп рдЧрд░реНрджрдЫ, OS рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рдЕрдореВрд░реНрддрддрд╛рдХреЛ рдирдпрд╛рдБ рддрд╣рд╣рд░реВред рдПрдмреНрд╕реНрдЯреНрд░реНрдпрд╛рдХреНрд╢рдирдХреЛ рдирд┐рд░реНрдорд╛рдгрдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрджрд╛, рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдПрдЙрдЯрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреН рдЬрд╕рд▓реЗ рдЕрд╡рд╕рд░ рдЫреЛрдбреНрдЫ, рдЙрдЪреНрдЪ-рд╕реНрддрд░ рдПрдмреНрд╕реНрдЯреНрд░реНрдпрд╛рдХреНрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, рддрд▓ рдПрдХ рд╡рд╛ рдмрдвреА рд╕реНрддрд░рд╣рд░реВ рддрд▓ рдЬрд╛рдиред рдкреНрд░рд╛рдпрдГ рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпрд╕рд▓реЗ рд╢рдЯрдЧрдирдХреЛ рд╕рд╛рде рдЦреБрдЯреНрдЯрд╛рдорд╛ рдЖрдлреИрд▓рд╛рдИ рдЧреЛрд▓реА рд╣рд╛рдиреНрди рдвреЛрдХрд╛ рдЦреЛрд▓реНрдЫ, рддрд░ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ, рджреБрд░реНрд▓рдн рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдПрдХ рдорд╛рддреНрд░ рддрд░рд┐рдХрд╛ рд╣реБрди рд╕рдХреНрдЫ рдЬреБрди рд╣рд╛рд▓рдХреЛ рдЕрдореВрд░реНрдд рд╕реНрддрд░рдорд╛ рд╕рдорд╛рдзрд╛рди рд╣реБрдБрджреИрдиред ред

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

рдереНрд░реЗрдб рд╕реБрд░реБ рдЧрд░реНрджреИ

рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕ .NET рдорд╛ рдереНрд░реЗрдбрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рдЖрдзрд╛рд░рднреВрдд рдХрдХреНрд╖рд╛ рд╣реЛред рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рд▓реЗ рджреБрдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдордзреНрдпреЗ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫ:

  • ThreadStart - рдХреБрдиреИ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЫреИрдирдиреН
  • ParametrizedThreadStart - рдкреНрд░рдХрд╛рд░рдХреЛ рд╡рд╕реНрддреБрдХреЛ рдПрдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╕рдБрдЧред

рдкреНрд░рддрд┐рдирд┐рдзрд┐рд▓рд╛рдИ рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐рд▓рд╛рдИ рдХрд▓ рдЧрд░реЗрдкрдЫрд┐ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдереНрд░реЗрдбрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫред рдпрджрд┐ ParametrizedThreadStart рдкреНрд░рдХрд╛рд░рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рд▓рд╛рдИ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреЗ, рдХреБрдиреИ рд╡рд╕реНрддреБрд▓рд╛рдИ рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐рдорд╛ рдкрд╛рд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпреЛ рд╕рдВрдпрдиреНрддреНрд░ рдХреБрдиреИ рдкрдирд┐ рд╕реНрдерд╛рдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреНрд░рд┐рдордорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдереНрд░реЗрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рдПрдХ рдорд╣рдБрдЧреЛ рдЕрдкрд░реЗрд╢рди рд╣реЛ, рд░ рдереНрд░реЗрдб рдЖрдлреИрдВрдорд╛ рднрд╛рд░реА рд╡рд╕реНрддреБ рд╣реЛ, рдХрдореНрддрд┐рдорд╛ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рд╕реНрдЯреНрдпрд╛рдХрдорд╛ 1MB рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрджрдЫ рд░ OS API рд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред

new Thread(...).Start(...);

ThreadPool рд╡рд░реНрдЧрд▓реЗ рдкреВрд▓рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рд▓рд╛рдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред .NET рдорд╛, рдереНрд░реЗрдб рдкреВрд▓ рдИрдиреНрдЬрд┐рдирд┐рдпрд░рд┐рдЩреНрдХреЛ рдПрдХ рдЯреБрдХреНрд░рд╛ рд╣реЛ, рд░ Microsoft рдорд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдзреЗрд░реИ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдХрд╛ рдЫрдиреН рдХрд┐ рдпрд╕рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВрдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдЫред

рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛:

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рднрдПрдХреЛ рдХреНрд╖рдгрдмрд╛рдЯ, рдпрд╕рд▓реЗ рдкреГрд╖реНрдарднреВрдорд┐рдорд╛ рд░рд┐рдЬрд░реНрднрдорд╛ рдзреЗрд░реИ рдереНрд░реЗрдбрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд▓рд┐рди рд╕рдХреНрдиреЗ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рдпрджрд┐ рдереНрд░реЗрдбрд╣рд░реВ рдмрд╛рд░рдореНрдмрд╛рд░ рд░ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рднрдиреЗ, рдХрд▓рд░рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдкреВрд░рд╛ рдЧрд░реНрди рдкреВрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реБрдиреНрдЫред рдЬрдм рдкреЛрдЦрд░реАрдорд╛ рд╕рд╣реА рд╕рдордпрдорд╛ рдХреБрдиреИ рдирд┐: рд╢реБрд▓реНрдХ рдереНрд░реЗрдбрд╣рд░реВ рдЫреИрдирдиреН, рдпрд╕рд▓реЗ рдпрд╛ рдд рдереНрд░реЗрдбрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдлрд░реНрдХрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреЗрдЫ, рд╡рд╛ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рдпреЛ рдереНрд░реЗрдб рдкреВрд▓ рдХреЗрд╣реА рдЫреЛрдЯреЛ-рдЕрд╡рдзрд┐ рдХрд╛рд░реНрдпрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЙрддреНрдХреГрд╖реНрдЯ рдЫ рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдореНрдкреВрд░реНрдг рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдЪрд▓реНрдиреЗ рдЕрдкрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХрдордЬреЛрд░ рд░реВрдкрдорд╛ рдЙрдкрдпреБрдХреНрдд рдЫред

рдкреВрд▓рдмрд╛рдЯ рдереНрд░реЗрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддреНрдпрд╣рд╛рдБ рдПрдХ QueueUserWorkItem рд╡рд┐рдзрд┐ рд╣реЛ рдЬрд╕рд▓реЗ WaitCallback рдкреНрд░рдХрд╛рд░рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рд▓рд╛рдИ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫ, рдЬрд╕рдорд╛ ParametrizedThreadStart рдЬрд╕реНрддреИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реБрдиреНрдЫ, рд░ рдпрд╕рд▓рд╛рдИ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд▓реЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдЧрд░реНрджрдЫред

ThreadPool.QueueUserWorkItem(...);

рдХрдо рдЬреНрдЮрд╛рдд рдереНрд░реЗрдб рдкреВрд▓ рд╡рд┐рдзрд┐ RegisterWaitForSingleObject рдЧреИрд░-рдмреНрд▓рдХрд┐рдЩ IO рд╕рдЮреНрдЪрд╛рд▓рдирд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдпрд╕ рд╡рд┐рдзрд┐рдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рд▓рд╛рдИ рднрдирд┐рдиреНрдЫ рдЬрдм рд╡рд┐рдзрд┐рдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ WaitHandle "рд░рд┐рд▓рд┐рдЬ" рд╣реБрдиреНрдЫред

ThreadPool.RegisterWaitForSingleObject(...)

.NET рд╕рдБрдЧ рдереНрд░реЗрдб рдЯрд╛рдЗрдорд░ рдЫ рд░ рдпреЛ WinForms/WPF рдЯрд╛рдЗрдорд░рд╣рд░реВ рднрдиреНрджрд╛ рдлрд░рдХ рдЫ рдХрд┐ рдпрд╕рдХреЛ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд▓рд╛рдИ рдкреВрд▓рдмрд╛рдЯ рд▓рд┐рдЗрдПрдХреЛ рдереНрд░реЗрдбрдорд╛ рдмреЛрд▓рд╛рдЗрдиреЗрдЫред

System.Threading.Timer

рддреНрдпрд╣рд╛рдБ рдкреВрд▓рдмрд╛рдЯ рдереНрд░реЗрдбрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрдард╛рдЙрдиреЗ рдмрд░реБ рд╡рд┐рджреЗрд╢реА рддрд░рд┐рдХрд╛ рдкрдирд┐ рдЫ - BeginInvoke рд╡рд┐рдзрд┐ред

DelegateInstance.BeginInvoke

рдо рдорд╛рдерд┐рдХрд╛ рдзреЗрд░реИ рд╡рд┐рдзрд┐рд╣рд░реВ - Kernel32.dll Win32 API рдмрд╛рдЯ CreateThread рдХрд▓ рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрдорд╛ рдзреНрдпрд╛рди рджрд┐рди рдЪрд╛рд╣рдиреНрдЫреБред рддреНрдпрд╣рд╛рдБ рдПрдХ рддрд░рд┐рдХрд╛ рдЫ, рдмрд╛рд╣реНрдп рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд╕рдВрдпрдиреНрддреНрд░рдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиред рдореИрд▓реЗ рд▓рд┐рдЧреЗрд╕реА рдХреЛрдбрдХреЛ рднрдпрд╛рдирдХ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдПрдХ рдкрдЯрдХ рдорд╛рддреНрд░ рдпрд╕реНрддреЛ рдХрд▓ рджреЗрдЦреЗрдХреЛ рдЫреБ, рд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпреЛ рдЧрд░реНрдиреЗ рд▓реЗрдЦрдХрдХреЛ рдкреНрд░реЗрд░рдгрд╛ рдЕрдЭреИ рдкрдирд┐ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рд░рд╣рд╕реНрдп рдмрдиреЗрдХреЛ рдЫред

Kernel32.dll CreateThread

рдереНрд░реЗрдбрд╣рд░реВ рд╣реЗрд░реНрдиреЗ рд░ рдбрд┐рдмрдЧ рдЧрд░реНрдиреЗ

рддрдкрд╛рдИрдВрд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрднрдПрдХреЛ рдереНрд░реЗрдбрд╣рд░реВ, рд╕рдмреИ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ, рд░ .NET рдкреВрд▓ рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛрдХреЛ рдереНрд░реЗрдбреНрд╕ рд╡рд┐рдиреНрдбреЛрдорд╛ рд╣реЗрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпреЛ рд╕рдЮреНрдЭреНрдпрд╛рд▓рд▓реЗ рдереНрд░реЗрдб рдЬрд╛рдирдХрд╛рд░реА рдорд╛рддреНрд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреЗрдЫ рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдбрд┐рдмрдЧ рдЕрдиреНрддрд░реНрдЧрдд рдЫ рд░ рдмреНрд░реЗрдХ рдореЛрдбрдорд╛ рдЫред рдпрд╣рд╛рдБ рддрдкрд╛рдИрдБрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдбрдХреЛ рд╕реНрдЯреНрдпрд╛рдХ рдирд╛рдо рд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рд╣рд░реВ рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░ рдбрд┐рдмрдЧрд┐рдЩрд▓рд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереНрд░реЗрдбрдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдереНрд░реЗрдб рд╡рд░реНрдЧрдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЧреБрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдЗрдБ рдереНрд░реЗрдбрдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬреБрди OC рд░ CLR рд▓реЗ рдереНрд░реЗрдбрд╣рд░реВ рдмреАрдЪрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрджрд╛ рд╕рд┐рдлрд╛рд░рд┐рд╕рдХреЛ рд░реВрдкрдорд╛ рдмреБрдЭреНрдиреЗрдЫред

.NET: рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩ рд░ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгрд╣рд░реВред рднрд╛рдЧ 1

рдХрд╛рд░реНрдп рд╕рдорд╛рдирд╛рдиреНрддрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп

Task Parallel Library (TPL) .NET 4.0 рдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдЕрдм рдпреЛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреА рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдорд╛рдирдХ рд░ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реЛред рдкреБрд░рд╛рдиреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреБрдиреИ рдкрдирд┐ рдХреЛрдбрд▓рд╛рдИ рд▓рд┐рдЧреЗрд╕реА рдорд╛рдирд┐рдиреНрдЫред TPL рдХреЛ рдЖрдзрд╛рд░рднреВрдд рдПрдХрд╛рдЗ System.Threading.Tasks рдиреЗрдорд╕реНрдкреЗрд╕рдмрд╛рдЯ рдХрд╛рд░реНрдп рд╡рд░реНрдЧ рд╣реЛред рдПрдХ рдХрд╛рд░реНрдп рдПрдХ рдереНрд░реЗрдб рдорд╛ рдПрдХ рд╕рд╛рд░ рд╣реЛред C# рднрд╛рд╖рд╛рдХреЛ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде, рд╣рд╛рдореАрд▓реЗ Tasks - async/await operators рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рд╕реБрдиреНрджрд░ рддрд░рд┐рдХрд╛ рдкрд╛рдпреМрдВред рдпреА рдЕрд╡рдзрд╛рд░рдгрд╛рд╣рд░реВрд▓реЗ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓реЗрдЦреНрди рд╕рдореНрднрд╡ рдмрдирд╛рдпреЛ рдЬрд╕реНрддреЛ рдХрд┐ рдпреЛ рд╕рд░рд▓ рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдерд┐рдпреЛ, рдпрд╕рд▓реЗ рдереНрд░реЗрдбрд╣рд░реВрдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдмрд╛рд░реЗ рдереЛрд░реИ рдмреБрдЭреЗрдХрд╛ рдорд╛рдирд┐рд╕рд╣рд░реВрд▓рд╛рдИ рдкрдирд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд▓реЗрдЦреНрди рд╕рдореНрднрд╡ рдмрдирд╛рдпреЛ, рд▓рд╛рдореЛ рдЕрдкрд░реЗрд╢рдирд╣рд░реВ рдЧрд░реНрджрд╛ рд╕реНрдерд┐рд░ рдирд╣реБрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВред async/await рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдПрдХ рд╡рд╛ рдзреЗрд░реИ рд▓реЗрдЦрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╖рдп рд╣реЛ, рддрд░ рдо рдХреЗрд╣реА рд╡рд╛рдХреНрдпрд╣рд░реВрдорд╛ рдпрд╕рдХреЛ рд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреБ:

  • async рдХрд╛рд░реНрдп рд╡рд╛ рд╢реВрдиреНрдп рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐рдХреЛ рдкрд░рд┐рдорд╛рд░реНрдЬрдХ рд╣реЛ
  • рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рдЧреИрд░-рдмреНрд▓рдХ рдЯрд╛рд╕реНрдХ рдкрд░реНрдЦрд╛рдЗ рдЕрдкрд░реЗрдЯрд░ рд╣реЛред

рдкреБрди: рдПрдХ рдкрдЯрдХ: рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдкрд░реЗрдЯрд░, рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд╕реНрдерд╛рдорд╛ (рддреНрдпрд╣рд╛рдБ рдЕрдкрд╡рд╛рджрд╣рд░реВ рдЫрдиреН), рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╣рд╛рд▓рдХреЛ рдереНрд░реЗрдбрд▓рд╛рдИ рдЬрд╛рд░реА рдЧрд░реНрдиреЗрдЫ, рд░ рдЬрдм рдХрд╛рд░реНрдпрд▓реЗ рдпрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╛рдкреНрдд рдЧрд░реНрджрдЫ, рд░ рдереНрд░реЗрдб (рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╕рдиреНрджрд░реНрдн рднрдиреНрдиреБ рдЕрдЭ рд╕рд╣реА рд╣реБрдиреЗрдЫред , рддрд░ рдкрдЫрд┐ рддреНрдпрд╕рдорд╛ рдердк) рд╡рд┐рдзрд┐рд▓рд╛рдИ рдердк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреЗрдЫред .NET рднрд┐рддреНрд░, рдпреЛ рдореЗрдХрд╛рдирд┐рдЬрдорд▓рд╛рдИ рдЙрдкрдЬ рд░рд┐рдЯрд░реНрдирдХреЛ рд░реВрдкрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдиреНрдЫ, рдЬрдм рд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдкреВрд░реНрдг рд╡рд░реНрдЧрдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫ, рдЬреБрди рд░рд╛рдЬреНрдп рдореЗрд╕рд┐рди рд╣реЛ рд░ рдпреА рд░рд╛рдЬреНрдпрд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИ рдЫреБрдЯреНрдЯреИ рдЯреБрдХреНрд░рд╛рд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЗрдЪреНрдЫреБрдХ рдЬреЛ рдХреЛрд╣реАрд▓реЗ asyn╤Б/await рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ рд╕рд╛рдзрд╛рд░рдг рдХреЛрдб рд▓реЗрдЦреНрди рд╕рдХреНрдЫрдиреН, рдХрдореНрдкрд╛рдЗрд▓рд░ рдЬреЗрдиреЗрд░реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рд╕рдХреНрд╖рдо рднрдПрдХреЛ JetBrains dotPeek рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрд╕реЗрдореНрдмрд▓реА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рд░ рд╣реЗрд░реНрди рд╕рдХреНрдЫрдиреНред

рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрди рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╣реЗрд░реМрдВред рддрд▓рдХреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдирдпрд╛рдБ рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ рдЬрд╕рд▓реЗ рдХреЗрд╣реА рдкрдирд┐ рдЙрдкрдпреЛрдЧреА рдЫреИрди (Thread.Sleep(10000)), рддрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирдорд╛ рдпреЛ рдХреЗрд╣рд┐ рдЬрдЯрд┐рд▓ CPU-рдЧрд╣рди рдХрд╛рдо рд╣реБрдиреБрдкрд░реНрдЫред

using TCO = System.Threading.Tasks.TaskCreationOptions;

public static async void VoidAsyncMethod() {
    var cancellationSource = new CancellationTokenSource();

    await Task.Factory.StartNew(
        // Code of action will be executed on other context
        () => Thread.Sleep(10000),
        cancellationSource.Token,
        TCO.LongRunning | TCO.AttachedToParent | TCO.PreferFairness,
        scheduler
    );

    //  Code after await will be executed on captured context
}

рдХрд╛рд░реНрдп рдзреЗрд░реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдХреЛ рд╕рд╛рде рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ:

  • LongRunning рдХрд╛рд░реНрдп рдЪрд╛рдБрдбреИ рдкреВрд░рд╛ рд╣реБрдиреЗ рдЫреИрди рднрдиреНрдиреЗ рд╕рдВрдХреЗрдд рд╣реЛ, рдЬрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рдкреЛрдЦрд░реАрдмрд╛рдЯ рдереНрд░реЗрдб рдирд▓рд┐рдиреЗ, рддрд░ рдЕрд░реВрд▓рд╛рдИ рд╣рд╛рдиреА рдирд╣реЛрд╕реН рднрдиреЗрд░ рдпрд╕ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдПрдЙрдЯрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рд▓рд╛рдпрдХ рд╣реБрди рд╕рдХреНрдЫред
  • AttachedToParent - рдХрд╛рд░реНрдпрд╣рд░реВ рдкрджрд╛рдиреБрдХреНрд░рдордорд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрджрд┐ рдпреЛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреЗ, рдХрд╛рд░реНрдп рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣реБрди рд╕рдХреНрдЫ рдЬрд╣рд╛рдБ рдпреЛ рдЖрдлреИрд▓реЗ рдкреВрд░рд╛ рдЧрд░реЗрдХреЛ рдЫ рд░ рдЖрдлреНрдирд╛ рдмрдЪреНрдЪрд╛рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдЫред
  • PreferFairness - рдпрд╕рдХреЛ рдЕрд░реНрде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрдард╛рдЗрдПрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрдЫрд┐ рдкрдард╛рдЗрдПрдХрд╛ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫред рддрд░ рдпреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдлрд╛рд░рд┐рд╕ рд╣реЛ рд░ рдкрд░рд┐рдгрд╛рдо рдЧреНрдпрд╛рд░реЗрдиреНрдЯреА рдЫреИрдиред

рд╡рд┐рдзрд┐рдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рджреЛрд╕реНрд░реЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рднрдиреЗрдХреЛ CancellationToken рд╣реЛред рдПрдХ рдЕрдкрд░реЗрд╢рди рд╕реБрд░реБ рднрдПрдкрдЫрд┐ рд░рджреНрдж рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд▓рд╛рдИ рд╕рд╣реА рд░реВрдкрдорд╛ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдЗрд░рд╣реЗрдХреЛ рдХреЛрдб рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд░рд╛рдЬреНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЪреЗрдХрд╣рд░реВ рднрд░рд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЬрд╛рдБрдЪрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ, рд░рджреНрдж рд╡рд┐рдзрд┐рд▓реЗ рд░рджреНрдж рдЧрд░реНрдиреЗ рдЯреЛрдХрдирдХреЛ рд╕реНрд░реЛрдд рд╡рд╕реНрддреБрдорд╛ рдмреЛрд▓рд╛рдЗрдПрдХреЛ рдХрд╛рд░реНрдп рд╕реБрд░реБ рд╣реБрдиреБ рдЕрдШрд┐ рдорд╛рддреНрд░ рдХрд╛рд░реНрдпрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░реЛрдХреНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫред

рдЕрдиреНрддрд┐рдо рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ TaskScheduler рдкреНрд░рдХрд╛рд░рдХреЛ рдЕрдиреБрд╕реВрдЪрдХ рд╡рд╕реНрддреБ рд╣реЛред рдпреЛ рд╡рд░реНрдЧ рд░ рдпрд╕рдХрд╛ рд╕рдиреНрддрд╛рдирд╣рд░реВ рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реНрдиреЗ рд░рдгрдиреАрддрд┐рд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН; рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдХрд╛рд░реНрдп рдкреВрд▓рдмрд╛рдЯ рдЕрдирд┐рдпрдорд┐рдд рдереНрд░реЗрдбрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫред

рдкрд░реНрдЦрд╛рдЗ рдЕрдкрд░реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдХрд╛рд░реНрдпрдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫ, рдЬрд╕рдХреЛ рдЕрд░реНрде рдпрд╕рдХреЛ рдкрдЫрд┐ рд▓реЗрдЦрд┐рдПрдХреЛ рдХреЛрдб, рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЫ рднрдиреЗ, рдкрд░реНрдЦрдиреБ рдЕрдШрд┐ рдХреЛрдб рдЬрд╕реНрддреИ рд╕рдорд╛рди рд╕рдиреНрджрд░реНрднрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫ (рдЕрдХреНрд╕рд░ рдпрд╕рдХреЛ рдЕрд░реНрде рдЙрд╣реА рдереНрд░реЗрдбрдорд╛)ред

рд╡рд┐рдзрд┐рд▓рд╛рдИ async void рдХреЛ рд░реВрдкрдорд╛ рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдПрдХреЛ рдЫ, рдЬрд╕рдХреЛ рдорддрд▓рдм рдпрд╕рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫ, рддрд░ рдХрд▓рд┐рдЩ рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗ рдЫреИрдиред рдпрджрд┐ рдпрд╕реНрддреЛ рд╕реБрд╡рд┐рдзрд╛ рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдп рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред async void рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдПрдХрд╛ рд╡рд┐рдзрд┐рд╣рд░реВ рдзреЗрд░реИ рд╕рд╛рдорд╛рдиреНрдп рдЫрдиреН: рдирд┐рдпрдордХреЛ рд░реВрдкрдорд╛, рдпреА рдШрдЯрдирд╛ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рд╡рд╛ рдЕрдиреНрдп рд╡рд┐рдзрд┐рд╣рд░реВ рд╣реБрдиреН рдЬрд╕рд▓реЗ рдЖрдЧреЛрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ рд░ рд╕рд┐рджреНрдзрд╛рдиреНрдд рдмрд┐рд░реНрд╕рдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдЕрдиреНрддреНрдп рд╕рдореНрдо рдкрд░реНрдЦрдиреЗ рдЕрд╡рд╕рд░ рдорд╛рддреНрд░ рджрд┐рдиреБ рдкрд░реНрджреИрди, рддрд░ рдирддрд┐рдЬрд╛ рдкрдирд┐ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

StartNew рд╡рд┐рдзрд┐ рдлрд┐рд░реНрддрд╛ рднрдПрдХреЛ рдХрд╛рд░реНрдпрдорд╛, рд╕рд╛рдереИ рдЕрдиреНрдп рдХреБрдиреИ рдкрдирд┐ рдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЧрд▓рдд рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдХреЛ рд╕рд╛рде рдХрдиреНрдлрд┐рдЧрд░рдЕрд╡реЗрдЯ рд╡рд┐рдзрд┐рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрдЫрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛рдкреНрдЪрд░ рдЧрд░рд┐рдПрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдЬрд╛рд░реА рд░рд╣рдиреЗрдЫ, рддрд░ рд╕реНрд╡реЗрдЪреНрдЫрд╛рдЪрд╛рд░реАрдорд╛ред рдпреЛ рд╕рдзреИрдВ рдЧрд░рд┐рдиреБрдкрд░реНрдЫ рдЬрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдиреНрджрд░реНрдн рдкреНрд░рддрд┐рдХреНрд╖рд╛ рдкрдЫрд┐ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫреИрдиред рдпреЛ рдХреЛрдб рд▓реЗрдЦреНрджрд╛ MS рдмрд╛рдЯ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдкрдирд┐ рд╣реЛ рдЬреБрди рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реА рдкрдард╛рдЗрдиреЗрдЫред

рддрдкрд╛рдИрдВ рдХрд╕рд░реА рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдЧрд░реНрди рдкрд░реНрдЦрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдереЛрд░реИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВред рддрд▓ рдХреЛрдбрдХреЛ рдЙрджрд╛рд╣рд░рдг рдЫ, рдЬрдм рдЕрдкреЗрдХреНрд╖рд╛ рд╕рд╢рд░реНрдд рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдЧрд░рд┐рдиреНрдЫ рд░ рдХрд╣рд┐рд▓реЗ рд╕рд╢рд░реНрдд рд░реВрдкрдорд╛ рдЦрд░рд╛рдм рдЧрд░рд┐рдиреНрдЫ рднрдиреНрдиреЗ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВ рд╕рд╣рд┐рддред

public static async void AnotherMethod() {

    int result = await AsyncMethod(); // good

    result = AsyncMethod().Result; // bad

    AsyncMethod().Wait(); // bad

    IEnumerable<Task> tasks = new Task[] {
        AsyncMethod(), OtherAsyncMethod()
    };

    await Task.WhenAll(tasks); // good
    await Task.WhenAny(tasks); // good

    Task.WaitAll(tasks.ToArray()); // bad
}

рдкрд╣рд┐рд▓реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╣рд╛рдореА рдХрд▓рд┐рдЩ рдереНрд░реЗрдбрд▓рд╛рдИ рдЕрд╡рд░реБрджреНрдз рдирдЧрд░реА рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫреМрдВ; рд╣рд╛рдореА рдирддрд┐рдЬрд╛ рдкреНрд░рд╢реЛрдзрдирдорд╛ рдлрд░реНрдХрдиреЗрдЫреМрдВ рдЬрдм рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рддреНрдпрд╣рд╛рдБ рдЫ; рддрдмрд╕рдореНрдо, рдХрд▓рд┐рдЩ рдереНрд░реЗрдб рдЖрдлреНрдиреИ рдпрдиреНрддреНрд░рд╣рд░реВрдорд╛ рдЫреЛрдбрд┐рдиреНрдЫред

рджреЛрд╕реНрд░реЛ рд╡рд┐рдХрд▓реНрдкрдорд╛, рд╡рд┐рдзрд┐рдХреЛ рдкрд░рд┐рдгрд╛рдо рдЧрдгрдирд╛ рдирднрдПрд╕рдореНрдо рд╣рд╛рдореА рдХрд▓рд┐рдЩ рдереНрд░реЗрдбрд▓рд╛рдИ рд░реЛрдХреНрдЫреМрдВред рдпреЛ рдирд░рд╛рдореНрд░реЛ рд╣реЛ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдереНрд░реЗрдб рдУрдЧрдЯреЗрдХрд╛ рдЫреМрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдпрд╕реНрддреЛ рдмрд╣реБрдореВрд▓реНрдп рд╕реНрд░реЛрдд, рд╕рд╛рдзрд╛рд░рдг рдЖрд▓рд╕реНрдпрдХрд╛ рд╕рд╛рде, рддрд░ рдпреЛ рдкрдирд┐ рдХрд┐рдирднрдиреЗ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдХрд▓ рдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐рдХреЛ рдХреЛрдб рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдЫ, рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд╕рдиреНрджрд░реНрднрд▓реЗ рдХрд▓рд┐рдЩ рдереНрд░реЗрдбрдорд╛ рдлрд░реНрдХрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗред рдкреНрд░рддреАрдХреНрд╖рд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдПрдХ рдЧрддрд┐рд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ : рдХрд▓рд┐рдЩ рдереНрд░реЗрдбрд▓реЗ рдЧрдгрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдХреЛ рдкрд░рд┐рдгрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫ, рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рд▓реЗ рдХрд▓рд┐рдЩ рдереНрд░реЗрдбрдорд╛ рдпрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд░рд╛рдЦреНрди рд╡реНрдпрд░реНрде рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫред

рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рдЕрд░реНрдХреЛ рд╣рд╛рдирд┐ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ рд╣реЛред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдбрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ async/await рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреНрдЫ - рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдХреЛрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рднрдП рдЬрд╕реНрддреИ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдЫрдиреНред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрдорд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡реЗрдЯ рдПрдХреНрд╕реЛрд░реНрд╕рд┐рдЬреНрдо рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ рднрдиреЗ, рдореВрд▓ рдЕрдкрд╡рд╛рдж AggregateException рдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреНред рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ InnerException рдкреНрд░рдХрд╛рд░рдХреЛ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ рд░ C# рд╕рдВрд╕рд╛рд░рдорд╛ рдкрд░рд┐рдЪрд┐рдд рдХреНрдпрд╛рдЪ рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдХреЛ рд╕рдЯреНрдЯрд╛, рдПрдЙрдЯрд╛ рдХреНрдпрд╛рдЪ рдмреНрд▓рдХ рднрд┐рддреНрд░ рдЖрдлреИрд▓рд╛рдИ рдпрджрд┐ рдЪреЗрди рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рд╡рд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛ рдХреНрдпрд╛рдЪ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддреЗрд╕реНрд░реЛ рд░ рдЕрдиреНрддрд┐рдо рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкрдирд┐ рдЙрд╣реА рдХрд╛рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдЦрд░рд╛рдм рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдПрдХрд╛ рдЫрдиреН рд░ рд╕рдмреИ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред

рдЬрдм рдХреБрдиреИ рд░ рдЬрдм рд╕рдмреИ рд╡рд┐рдзрд┐рд╣рд░реВ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рдореВрд╣рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЕрддреНрдпрдиреНрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫрдиреН; рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рдореВрд╣рд▓рд╛рдИ рдПрдЙрдЯрд╛рдорд╛ рдмреЗрд░реНрдЫрдиреН, рдЬреБрди рд╕рдореВрд╣рдмрд╛рдЯ рдХрд╛рд░реНрдп рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реБрдБрджрд╛ рд╡рд╛ рддреА рд╕рдмреИрд▓реЗ рдЖрдлреНрдиреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░рд╛ рдЧрд░реЗрдкрдЫрд┐ рд╕рдХреНрд░рд┐рдп рд╣реБрдиреЗрдЫред

рдереНрд░реЗрдбрд╣рд░реВ рд░реЛрдХреНрджреИ

рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгрд╣рд░реВрд▓реЗ рдЧрд░реНрджрд╛, рдпреЛ рд╕реБрд░реБ рднрдПрдкрдЫрд┐ рдкреНрд░рд╡рд╛рд╣ рд░реЛрдХреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрди рд╕рдХреНрдЫред рдпреЛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреНред рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕рдорд╛ рджреБрдИ рдЙрдкрдпреБрдХреНрдд рдирд╛рдо рджрд┐рдЗрдПрдХреЛ рд╡рд┐рдзрд┐рд╣рд░реВ рдЫрдиреН: рдкрд░рд┐рддреНрдпрд╛рдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН ╨╕ рдЕрд╡рд░реЛрдзред рдкрд╣рд┐рд▓реЛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЕрддреНрдпрдзрд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рдХрд┐рдирднрдиреЗ рдХреБрдиреИ рдкрдирд┐ рдЕрдирд┐рдпрдорд┐рдд рдХреНрд╖рдгрдорд╛ рдпрд╕рд▓рд╛рдИ рдХрд▓ рдЧрд░реЗрдкрдЫрд┐, рдХреБрдиреИ рдкрдирд┐ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рдкреНрд░рд╢реЛрдзрдирдХреЛ рдХреНрд░рдордорд╛, рдПрдХ рдЕрдкрд╡рд╛рдж рдлреНрдпрд╛рдБрдХрд┐рдиреЗрдЫред ThreadAbortedExceptionред рддрдкрд╛рдИрдВрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рд╡реГрджреНрдзрд┐ рдЧрд░реНрджрд╛ рдпрд╕реНрддреЛ рдЕрдкрд╡рд╛рдж рдлреНрдпрд╛рдБрдХрд┐рдПрдХреЛ рдЖрд╢рд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрди, рд╣реИрди? рд░ рдпреЛ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, рдпреЛ рдПрдХ рдзреЗрд░реИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛред рдпрджрд┐ рддрдкрд╛рдЗрдБрд▓реЗ CLR рд▓рд╛рдИ рдХреЛрдбрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдЦрдгреНрдбрдорд╛ рдпрд╕реНрддреЛ рдЕрдкрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рдЧрд░реНрдирдмрд╛рдЯ рд░реЛрдХреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдХрд▓рд╣рд░реВрдорд╛ рд▓рдкреЗрдЯреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред Thread.BeginCriticalRegion, Thread.EndCriticalRegionред рдЕрдиреНрддрдорд╛ рдмреНрд▓рдХрдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдХреБрдиреИ рдкрдирд┐ рдХреЛрдб рддреНрдпрд╕реНрддрд╛ рдХрд▓рд╣рд░реВрдорд╛ рдмреЗрд░рд┐рдПрдХреЛ рд╣реБрдиреНрдЫред рдпрд╕ рдХрд╛рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдбрдХреЛ рдЧрд╣рд┐рд░рд╛рдЗрдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рдЦрд╛рд▓реА рдкреНрд░рдпрд╛рд╕рдХреЛ рд╕рд╛рде рдмреНрд▓рдХрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдЕрдиреНрддрдорд╛ рдЦрд╛рд▓реА рдЫреИрдиред рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯрд▓реЗ рдпрд╕ рд╡рд┐рдзрд┐рд▓рд╛рдИ рдпрддрд┐ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдЧрд░реНрджрдЫ рдХрд┐ рдЙрдиреАрд╣рд░реВрд▓реЗ рдпрд╕рд▓рд╛рдИ .net рдХреЛрд░рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реЗрдирдиреНред

рдЕрд╡рд░реЛрдз рд╡рд┐рдзрд┐рд▓реЗ рдЕрдзрд┐рдХ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рдЕрдкрд╡рд╛рджрдХреЛ рд╕рд╛рде рдереНрд░реЗрдбрд▓рд╛рдИ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рд╕рдХреНрдЫ ThreadInterruptedException рдХреЗрд╡рд▓ рддреА рдХреНрд╖рдгрд╣рд░реВрдорд╛ рдЬрдм рдереНрд░реЗрдб рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣реБрдиреНрдЫред WaitHandle, рд▓рдХ, рд╡рд╛ Thread.Sleep рдХрд▓ рдЧрд░реЗрдкрдЫрд┐ рд╣реНрдпрд╛рдЩреНрдЧрд┐рдЩ рдЧрд░реНрджрд╛ рдпреЛ рд╕реНрдерд┐рддрд┐рдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрдЫред

рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рджреБрд╡реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рддрддрд╛рдХреЛ рдХрд╛рд░рдг рдЦрд░рд╛рдм рдЫрдиреНред рд╕рдорд╛рдзрд╛рди рднрдиреЗрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛ рд░рджреНрдж рдЧрд░реНрдиреЗ рдЯреЛрдХрди рд░ рдХрдХреНрд╖рд╛ рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд╕реНрд░реЛрддред рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ: рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд╕реНрд░реЛрдд рд╡рд░реНрдЧрдХреЛ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдпрд╕рдХреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓рд┐рдиреЗрд▓реЗ рдорд╛рддреНрд░ рд╡рд┐рдзрд┐рд▓рд╛рдИ рдХрд▓ рдЧрд░реЗрд░ рд╕рдЮреНрдЪрд╛рд▓рди рд░реЛрдХреНрди рд╕рдХреНрдЫред рд░рджреНрджред рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рдорд╛рддреНрд░ рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫред CancellationToken рдорд╛рд▓рд┐рдХрд╣рд░реВрд▓реЗ рдЖрдлреИрдВрд▓реЗ рд╕рдЮреНрдЪрд╛рд▓рди рд░рджреНрдж рдЧрд░реНрди рд╕рдХреНрджреИрдирдиреН, рддрд░ рдЕрдкрд░реЗрд╢рди рд░рджреНрдж рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдорд╛рддреНрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдмреБрд▓рд┐рдпрди рд╕рдореНрдкрддреНрддрд┐ рдЫ рд░рджреНрдж рдЧрд░реНрди рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдпреЛ рд░ рд╡рд┐рдзрд┐ ThrowIfCancel рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдпреЛред рдкрдЫрд┐рд▓реНрд▓реЛрд▓реЗ рдЕрдкрд╡рд╛рдж рдлреНрдпрд╛рдБрдХреНрдиреЗрдЫ TaskCancelledException рдпрджрд┐ рд░рджреНрдж рд╡рд┐рдзрд┐рд▓рд╛рдИ рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рдЙрджрд╛рд╣рд░рдгрдорд╛ рдмреЛрд▓рд╛рдЗрдпреЛ рднрдиреЗред рд░ рдпреЛ рдореИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐ рд╣реЛред рдпреЛ рдХреБрди рдмрд┐рдиреНрджреБрдорд╛ рдЕрдкрд╡рд╛рдж рдЕрдкрд░реЗрд╢рди рд░рджреНрдж рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреНрдиреЗрдорд╛ рдкреВрд░реНрдг рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрд░ рдЕрдШрд┐рд▓реНрд▓реЛ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдорд╛ рднрдПрдХреЛ рд╕реБрдзрд╛рд░ рд╣реЛред

рдереНрд░реЗрдб рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рдХреНрд░реВрд░ рд╡рд┐рдХрд▓реНрдк Win32 API TerminateThread рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреБ рд╣реЛред рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реЗрдкрдЫрд┐ CLR рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реБрди рд╕рдХреНрдЫред MSDN рдорд╛ рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдирд┐рдореНрди рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ: "TerminateThread рдПрдХ рдЦрддрд░рдирд╛рдХ рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛ рдЬреБрди рдХреЗрд╡рд▓ рд╕рдмреИрднрдиреНрджрд╛ рдЪрд░рдо рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреБ рдкрд░реНрдЫред "

FromAsync рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдЧреЗрд╕реА API рд▓рд╛рдИ рдЯрд╛рд╕реНрдХрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛ рдХрд╛рдо рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдкрд░реНрдпрд╛рдкреНрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реБрдиреБрд╣реБрдиреНрдЫ рдЬреБрди Tasks рдХреЛ рдкрд░рд┐рдЪрдп рдкрдЫрд┐ рд╕реБрд░реБ рднрдПрдХреЛ рдерд┐рдпреЛ рд░ рдзреЗрд░реИ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рд╢рд╛рдиреНрдд рдбрд░ рдкреИрджрд╛ рдЧрд░реНрди рдмрдиреНрдж рднрдпреЛ, рддрдм рддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдкреБрд░рд╛рдирд╛ APIs, рджреБрдмреИ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рд░ рддрдкрд╛рдЗрдБрдХреЛ рдЯреЛрд▓реАрд╕рдБрдЧ рд╕рдореНрдЭреМрддрд╛ рдЧрд░реНрдиреБ рдкрд░реНрджреИрдиред рд╡рд┐рдЧрддрдорд╛ рдпрд╛рддрдирд╛ рджрд┐рдПрдХреЛ рдЫ ред рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдЯреЛрд▓реАрд▓реЗ рд╣рд╛рдореНрд░реЛ рд╣реЗрд░рдЪрд╛рд╣ рдЧрд░реНрдпреЛ, рд╣реБрдирд╕рдХреНрдЫ рд▓рдХреНрд╖реНрдп рдЖрдлреНрдиреЛ рд╣реЗрд░рдЪрд╛рд╣ рдЧрд░реНрдиреБ рдерд┐рдпреЛред рдЬрд╕реНрддреЛрд╕реБрдХреИ рд╣реЛрд╕реН, .NET рд╕рдБрдЧ рдкреБрд░рд╛рдиреЛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдХреЛрдбрд▓рд╛рдИ рдкреАрдбрд╛рд░рд╣рд┐рдд рд░реВрдкрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреНред рддреА рдордзреНрдпреЗ рдПрдХ TaskFactory рдХреЛ FromAsync рд╡рд┐рдзрд┐ рд╣реЛред рддрд▓рдХреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрдорд╛, рдореИрд▓реЗ WebRequest рдХреНрд▓рд╛рд╕рдХреЛ рдкреБрд░рд╛рдиреЛ async рд╡рд┐рдзрд┐рд╣рд░реВ рдпреЛ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЯрд╛рд╕реНрдХрдорд╛ рд░реНтАНрдпрд╛рдк рдЧрд░реНрдЫреБред

object state = null;
WebRequest wr = WebRequest.CreateHttp("http://github.com");
await Task.Factory.FromAsync(
    wr.BeginGetResponse,
    we.EndGetResponse
);

рдпреЛ рдХреЗрд╡рд▓ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд░ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░рд╣рд░реВрд╕рдБрдЧ рдЧрд░реНрдиреБ рдкрд░реНрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛ рдЫреИрди, рддрд░ рдХреБрдиреИ рдкрдирд┐ рдкреБрд░рд╛рдиреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓реЗ рдпрд╕рд▓рд╛рдИ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ IAsyncResult рд░ EndDoSomething рд╡рд┐рдзрд┐рд╣рд░реВ рдлрд░реНрдХрд╛рдЙрдиреЗ BeginDoSomething рд╡рд┐рдзрд┐рд╣рд░реВрд╕рдБрдЧ рдорд╛рддреНрд░ рдорд┐рд▓реНрдЫред

TaskCompletionSource рдХреНрд▓рд╛рд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Legacy API рд▓рд╛рдИ Task Based рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рдЕрд░реНрдХреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЙрдкрдХрд░рдг рдХрдХреНрд╖рд╛ рд╣реЛ TaskCompletion рд╕реНрд░реЛрддред рдХрд╛рд░реНрдпрд╣рд░реВ, рдЙрджреНрджреЗрд╢реНрдп рд░ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕рд┐рджреНрдзрд╛рдиреНрддрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпреЛ рдХреЗрд╣рд┐ рд╣рджрд╕рдореНрдо рдереНрд░реЗрдбрдкреБрд▓ рдХрдХреНрд╖рд╛рдХреЛ RegisterWaitForSingleObject рд╡рд┐рдзрд┐рдХреЛ рд╕рдореНрдЭрдирд╛ рджрд┐рд▓рд╛рдЙрдиреЗ рд╣реБрди рд╕рдХреНрдЫ, рдЬреБрди рдореИрд▓реЗ рдорд╛рдерд┐ рд▓реЗрдЦреЗрдХреЛ рдЫреБред рдпреЛ рд╡рд░реНрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдЗрдБ рдЯрд╛рд╕реНрдХрд╣рд░реВрдорд╛ рдкреБрд░рд╛рдиреЛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ API рд╣рд░реВ рд╕рдЬрд┐рд▓реИ рд░ рд╕рд╣рдЬ рд░реВрдкрдорд╛ рд▓рдкреЗрдЯреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рддрдкрд╛рдИрдВрд▓реЗ рднрдиреНрдиреБрд╣реБрдиреЗрдЫ рдХрд┐ рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреА рдЙрджреНрджреЗрд╢реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд▓рдХреНрд╖рд┐рдд TaskFactory рдХрдХреНрд╖рд╛рдХреЛ FromAsync рд╡рд┐рдзрд┐рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░рд┐рд╕рдХреЗрдХреЛ рдЫреБред рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓реЗ .net рдорд╛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдореЛрдбреЗрд▓рд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕рдХреЛ рд╕рдореНрдкреВрд░реНрдг рдЗрддрд┐рд╣рд╛рд╕ рд╕рдореНрдЭрдиреБрдкрд░реНрдЫ рдЬреБрди рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯрд▓реЗ рд╡рд┐рдЧрдд 15 рд╡рд░реНрд╖рд╣рд░реВрдорд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реЗрдХреЛ рдЫ: рдЯрд╛рд╕реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдврд╛рдБрдЪрд╛ (TAP) рдЕрдШрд┐, рддреНрдпрд╣рд╛рдБ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рдврд╛рдБрдЪрд╛ (APP), рдЬреБрди рдерд┐рдпреЛред рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдерд┐рдпреЛ рд╕реБрд░реВ рдЧрд░реНрдиреБрд╣реЛрд╕реНрдХреЗрд╣рд┐ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджреИ IAsyncResult рд░ рд╡рд┐рдзрд┐рд╣рд░реВ рдЕрдиреНрддDoSomething рдЬрд╕рд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫ рд░ рдпреА рд╡рд░реНрд╖рд╣рд░реВрдХреЛ рд╡рд┐рд░рд╛рд╕рддрдХреЛ рд▓рд╛рдЧрд┐ FromAsync рд╡рд┐рдзрд┐ рдПрдХрджрдо рд╕рд╣реА рдЫ, рддрд░ рд╕рдордпрдХреЛ рд╕рд╛рде, рдпреЛ рдШрдЯрдирд╛ рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдврд╛рдБрдЪрд╛ (рд░ рдПрдкреА), рдЬрд╕рд▓реЗ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдЕрдкрд░реЗрд╕рди рдкреВрд░рд╛ рднрдПрдкрдЫрд┐ рдПрдЙрдЯрд╛ рдШрдЯрдирд╛ рдЙрдареНрдиреЗрдЫ рднрдиреЗрд░ рдорд╛рдиреЗрдХреЛ рдЫред

TaskCompletionSource рдШрдЯрдирд╛ рдореЛрдбреЗрд▓ рд╡рд░рд┐рдкрд░рд┐ рдирд┐рд░реНрдорд┐рдд Tasks рд░ рд▓рд┐рдЧреЗрд╕реА API рд╣рд░реВ рд░реНтАНрдпрд╛рдк рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдЫред рдпрд╕рдХреЛ рдХрд╛рдордХреЛ рд╕рд╛рд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ: рдпрд╕ рд╡рд░реНрдЧрдХреЛ рд╡рд╕реНрддреБрд╕рдБрдЧ рдЯрд╛рд╕реНрдХ рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдореНрдкрддреНрддрд┐ рдЫ, рдЬрд╕рдХреЛ рдЕрд╡рд╕реНрдерд╛ SetResult, SetException, рдЖрджрд┐ TaskCompletionSource рд╡рд░реНрдЧрдХреЛ рд╡рд┐рдзрд┐рд╣рд░реВ рдорд╛рд░реНрдлрдд рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕ рдХрд╛рд░реНрдпрдорд╛ рдкреНрд░рддрд┐рдХреНрд╖рд╛ рдЕрдкрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдард╛рдЙрдБрд╣рд░реВрдорд╛, TaskCompletionSource рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рдзрд┐рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдЕрдкрд╡рд╛рджрдХреЛ рд╕рд╛рде рдпреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛ рдЕрд╕рдлрд▓ рд╣реБрдиреЗрдЫред рдпрджрд┐ рдпреЛ рдЕрдЭреИ рд╕реНрдкрд╖реНрдЯ рдЫреИрди рднрдиреЗ, рдпреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВ, рдЬрд╣рд╛рдБ рдХреЗрд╣рд┐ рдкреБрд░рд╛рдиреЛ EAP API рдЯрд╛рд╕реНрдХрдорд╛ рдПрдХ TaskCompletionSource рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдмреЗрд░рд┐рдПрдХреЛ рдЫ: рдЬрдм рдШрдЯрдирд╛ рдлрд╛рдпрд░ рд╣реБрдиреНрдЫ, рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд╣реБрдиреЗрдЫ, рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдкрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐ред рдпрд╕ рдХрд╛рд░реНрдпрдорд╛ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рднрдПрдкрдЫрд┐ рдпрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреБрди: рд╕реБрд░реБ рд╣реБрдиреЗрдЫ рдкрд░рд┐рдгрд╛рдо.

public static Task<Result> DoAsync(this SomeApiInstance someApiObj) {

    var completionSource = new TaskCompletionSource<Result>();
    someApiObj.Done += 
        result => completionSource.SetResult(result);
    someApiObj.Do();

    result completionSource.Task;
}

TaskCompletionрд╕реНрд░реЛрдд рд╕реБрдЭрд╛рд╡ рд░ рдпреБрдХреНрддрд┐рд╣рд░реВ

TaskCompletionSource рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреБрд░рд╛рдиреЛ API рд╣рд░реВ рд░реНтАНрдпрд╛рдкрд┐рдЩ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрдиред рдпрд╕ рд╡рд░реНрдЧрдХреЛ рдкреНрд░рдпреЛрдЧрд▓реЗ рдереНрд░реЗрдбрд╣рд░реВрд▓реЗ рдУрдЧрдЯреЗрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рд╡рд┐рднрд┐рдиреНрди API рд╣рд░реВ рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрдиреЗ рд░реЛрдЪрдХ рд╕рдореНрднрд╛рд╡рдирд╛ рдЦреЛрд▓реНрдЫред рд░ рд╕реНрдЯреНрд░рд┐рдо, рдЬрд╕рд░реА рд╣рд╛рдореА рд╕рдореНрдЭрдиреНрдЫреМрдВ, рдПрдХ рдорд╣рдБрдЧреЛ рд╕реНрд░реЛрдд рд╣реЛ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рдЫ (рдореБрдЦреНрдпрддрдпрд╛ RAM рдХреЛ рдорд╛рддреНрд░рд╛ рджреНрд╡рд╛рд░рд╛)ред рдпреЛ рд╕реАрдорд╛ рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╡рд┐рдХрд╛рд╕ рдЧрд░реЗрд░ рд╣рд╛рд╕рд┐рд▓ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЬрдЯрд┐рд▓ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХрдХреЛ рд╕рд╛рде рд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧред рд▓рдЩ-рдкреЛрд▓рд┐рдЩ рдЬрд╕реНрддрд╛ рдЯреНрд░рд┐рдХ рд▓рд╛рдЧреВ рдЧрд░реНрджрд╛ рдореИрд▓реЗ рдХреБрд░рд╛ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рд╕рдореНрднрд╛рд╡рдирд╛рд╣рд░реВрд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВред

рдЫреЛрдЯрдХрд░реАрдорд╛, рдЪрд╛рд▓рдХреЛ рд╕рд╛рд░ рдпреЛ рд╣реЛ: рддрдкрд╛рдИрдВрд▓реЗ API рдмрд╛рдЯ рдпрд╕рдХреЛ рдЫреЗрдЙрдорд╛ рд╣реБрдиреЗ рдХреЗрд╣реА рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬрдмрдХрд┐ API, рдХреБрдиреИ рдХрд╛рд░рдгрд▓реЗ, рдШрдЯрдирд╛ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрди рд╕рдХреНрджреИрди, рддрд░ рдХреЗрд╡рд▓ рд░рд╛рдЬреНрдп рдлрд░реНрдХрд╛рдЙрди рд╕рдХреНрдЫред рдпреА рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг WebSocket рдХреЛ рд╕рдордп рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ HTTP рдХреЛ рд╢реАрд░реНрд╖ рдорд╛ рдирд┐рд░реНрдорд┐рдд рд╕рдмреИ API рд╣рд░реВ рд╣реБрдиреН рд╡рд╛ рдЬрдм рдпреЛ рдкреНрд░рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдХреБрдиреИ рдХрд╛рд░рдгрд▓реЗ рдЕрд╕рдореНрднрд╡ рдерд┐рдпреЛред рдЧреНрд░рд╛рд╣рдХрд▓реЗ HTTP рд╕рд░реНрднрд░рд▓рд╛рдИ рд╕реЛрдзреНрди рд╕рдХреНрдЫред HTTP рд╕рд░реНрднрд░рд▓реЗ рдЧреНрд░рд╛рд╣рдХрд╕рдБрдЧ рд╕рдЮреНрдЪрд╛рд░ рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрджреИрдиред рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рднрдиреЗрдХреЛ рдЯрд╛рдЗрдорд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░ рдкреЛрд▓ рдЧрд░реНрдиреБ рд╣реЛ, рддрд░ рдпрд╕рд▓реЗ рд╕рд░реНрднрд░рдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рд░ рдФрд╕рдд TimerInterval / 2 рдорд╛ рдердк рдврд┐рд▓рд╛рдЗ рдЧрд░реНрджрдЫред рдпрд╕рдХреЛ рд╡рд░рд┐рдкрд░рд┐ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди, Long Polling рднрдирд┐рдиреЗ рдПрдХ рдЪрд╛рд▓ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдЬрд╕рдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдврд┐рд▓рд╛рдЗ рд╕рдорд╛рд╡реЗрд╢ рдЫред рд╕рд░реНрднрд░рдХреЛ рд╕рдордпрд╛рд╡рдзрд┐ рд╕рдорд╛рдкреНрдд рдирднрдПрд╕рдореНрдо рд╡рд╛ рдШрдЯрдирд╛ рдШрдЯреНрдиреЗрдЫред рдпрджрд┐ рдШрдЯрдирд╛ рднрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдПрдХреЛ рдЫ, рдпрджрд┐ рдЫреИрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдЕрдиреБрд░реЛрдз рдлреЗрд░рд┐ рдкрдард╛рдЗрдиреНрдЫред

while(!eventOccures && !timeoutExceeded)  {

  CheckTimout();
  CheckEvent();
  Thread.Sleep(1);
}

рддрд░ рдШрдЯрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреЗ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдмрдвреНрджреИ рдЬрд╛рдБрджрд╛ рдпрд╕реНрддреЛ рд╕рдорд╛рдзрд╛рди рднрдпрд╛рдирдХ рд╕рд╛рдмрд┐рдд рд╣реБрдиреЗрдЫ, рдХрд┐рдирднрдиреЗ ... рдкреНрд░рддреНрдпреЗрдХ рдпрд╕реНрддреЛ рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдШрдЯрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдБрджреИ рд╕рдореНрдкреВрд░реНрдг рдереНрд░реЗрдб рдУрдЧрдЯреЗрдХреЛ рдЫред рд╣реЛ, рд░ рдШрдЯрдирд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реБрдБрджрд╛ рд╣рд╛рдореАрд▓реЗ 1ms рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдврд┐рд▓рд╛рдЗ рдкрд╛рдЙрдБрдЫреМрдВ, рдкреНрд░рд╛рдпрдГ рдпреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╣реБрдБрджреИрди, рддрд░ рдХрд┐рди рд╕рдлреНрдЯрд╡реЗрдпрд░рд▓рд╛рдИ рдпреЛ рд╣реБрди рд╕рдХреНрдиреЗ рднрдиреНрджрд╛ рдЦрд░рд╛рдм рдмрдирд╛рдЙрдБрдЫ? рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ Thread.Sleep(1) рд▓рд╛рдИ рд╣рдЯрд╛рдпреМрдВ, рддрдм рд╡реНрдпрд░реНрдердорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ 100% рдирд┐рд╖реНрдХреНрд░рд┐рдп рд▓реЛрдб рдЧрд░реНрдиреЗрдЫреМрдВ, рдПрдХ рдмреЗрдХрд╛рд░ рдЪрдХреНрд░рдорд╛ рдШреБрдорд╛рдЙрдБрджреИред TaskCompletionSource рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрдкрд╛рдИрд▓реЗ рдпреЛ рдХреЛрдб рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд░рд┐рдореЗрдХ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдорд╛рдерд┐ рдкрд╣рд┐рдЪрд╛рди рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

class LongPollingApi {

    private Dictionary<int, TaskCompletionSource<Msg>> tasks;

    public async Task<Msg> AcceptMessageAsync(int userId, int duration) {

        var cs = new TaskCompletionSource<Msg>();
        tasks[userId] = cs;
        await Task.WhenAny(Task.Delay(duration), cs.Task);
        return cs.Task.IsCompleted ? cs.Task.Result : null;
    }

    public void SendMessage(int userId, Msg m) {

        if (tasks.TryGetValue(userId, out var completionSource))
            completionSource.SetResult(m);
    }
}

рдпреЛ рдХреЛрдб рдЙрддреНрдкрд╛рджрди-рддрдпрд╛рд░ рдЫреИрди, рддрд░ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдореЛред рдпрд╕рд▓рд╛рдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдХрдореНрддрд┐рдорд╛ рдкрдирд┐, рдХреБрдиреИ рдкрдирд┐ рд╡реНрдпрдХреНрддрд┐рд▓реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдирдЧрд░реЗрдХреЛ рд╕рдордпрдорд╛ рд╕рдиреНрджреЗрд╢ рдЖрдЙрдБрджрд╛ рд╕реНрдерд┐рддрд┐ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ: рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, AsseptMessageAsync рд╡рд┐рдзрд┐рд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдореНрдкрдиреНрди рднрдПрдХреЛ рдХрд╛рд░реНрдп рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпрджрд┐ рдпреЛ рд╕рдмреИ рднрдиреНрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реЛ рднрдиреЗ, рддрдкрд╛рдИрдВ ValueTask рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд╕реЛрдЪреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдЬрдм рд╣рд╛рдореАрд▓реЗ рд╕рдиреНрджреЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореА рд╢рдмреНрджрдХреЛрд╢рдорд╛ TaskCompletionSource рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ рд░ рд░рд╛рдЦреНрдЫреМрдВ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкрд╣рд┐рд▓реЗ рдХреЗ рд╣реБрдиреНрдЫ рднрдиреЗрд░ рдкрд░реНрдЦрдиреБрд╣реЛрд╕реН: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдЕрдиреНрддрд░рд╛рд▓ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫ рд╡рд╛ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫред

ValueTask: рдХрд┐рди рд░ рдХрд╕рд░реА

async/await рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ, рдЬрд╕реНрддреИ рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдЕрдкрд░реЗрдЯрд░, рд╡рд┐рдзрд┐рдмрд╛рдЯ рд░рд╛рдЬреНрдп рдореЗрд╕рд┐рди рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рд░ рдпреЛ рдПрдЙрдЯрд╛ рдирдпрд╛рдБ рд╡рд╕реНрддреБрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд╣реЛ, рдЬреБрди рд▓рдЧрднрдЧ рд╕рдзреИрдВ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╣реБрдБрджреИрди, рддрд░ рджреБрд░реНрд▓рдн рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕рд▓реЗ рд╕рдорд╕реНрдпрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдЫред рдпреЛ рдХреЗрд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реБрди рд╕рдХреНрдЫ рдЬреБрди рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреНрд░рд╛рдп: рднрдирд┐рдиреНрдЫ, рд╣рд╛рдореА рджрд╕реМрдВ рд░ рд╕рдпреМрдВ рд╣рдЬрд╛рд░реМрдВ рдХрд▓рд╣рд░реВ рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдбрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВред рдпрджрд┐ рдпрд╕реНрддреЛ рд╡рд┐рдзрд┐ рдпрд╕рд░реА рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рдХрд┐ рдкреНрд░рд╛рдп рдЬрд╕реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕рд▓реЗ рд╕рдмреИ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐рд╣рд░реВрд▓рд╛рдИ рдмрд╛рдЗрдкрд╛рд╕ рдЧрд░реЗрд░ рдкрд░рд┐рдгрд╛рдо рдлрд░реНрдХрд╛рдЙрдБрдЫ, рддрдм .NET рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬ рдЧрд░реНрди рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ - ValueTask рд╕рдВрд░рдЪрдирд╛ред рдпрд╕рд▓рд╛рдИ рд╕реНрдкрд╖реНрдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВ: рддреНрдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдХреНрдпрд╛рд╕ рдЫ рдЬреБрди рд╣рд╛рдореА рдкреНрд░рд╛рдп: рдЬрд╛рдиреНрдЫреМрдВред рдпрд╕рдорд╛ рдХреЗрд╣реА рдорд╛рдирд╣рд░реВ рдЫрдиреН рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫреМрдВ; рдпрджрд┐ рд╣реЛрдЗрди рднрдиреЗ, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреЗрд╣реА рдврд┐рд▓реЛ IO рдорд╛ рдЬрд╛рдиреНрдЫреМрдВред рдо рдкрдЫрд┐рд▓реНрд▓реЛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рдЬрд╕рдХреЛ рдорддрд▓рдм рд╕рдореНрдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд╣реБрди рдЬрд╛рдиреНрдЫред рддрд╕рд░реНрде, рд╡рд┐рдзрд┐ рд▓реЗрдЦреНрдиреЗ рд╕реНрдкрд╖реНрдЯ рддрд░рд┐рдХрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:

public async Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return val;
    return await RequestById(id);
}

рдереЛрд░реИ рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрдиреЗ рдЗрдЪреНрдЫрд╛рдХреЛ рдХрд╛рд░рдг, рд░ рдпреЛ рдХреЛрдб рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрджрд╛ рд░реЛрдЬрд▓рд┐рдирд▓реЗ рдХреЗ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗрдЫ рднрдиреНрдиреЗ рдЕрд▓рд┐рдХрддрд┐ рдбрд░рдХреЛ рдХрд╛рд░рдг, рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдЙрджрд╛рд╣рд░рдгрд▓рд╛рдИ рдирд┐рдореНрди рд░реВрдкрдорд╛ рдкреБрди: рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

public Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return Task.FromResult(val);
    return RequestById(id);
}

рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рд╣рдЯ-рдкрде рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬ рдЧрд░реНрдиреБ рд╣реЛ, рдЕрд░реНрдерд╛рддреН, рдХреБрдиреИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рдВрдЯрди рд░ GC рдорд╛ рд▓реЛрдб рдмрд┐рдирд╛ рд╢рдмреНрджрдХреЛрд╢рдмрд╛рдЯ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ, рдЬрдмрдХрд┐ рддреА рджреБрд░реНрд▓рдн рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЬрдм рд╣рд╛рдореАрд▓реЗ рдбрд╛рдЯрд╛рдХреЛ рд▓рд╛рдЧрд┐ IO рдорд╛ рдЬрд╛рдиреБ рдкрд░реНрдЫред , рд╕рдмреИ рдХреБрд░рд╛ рдкреБрд░рд╛рдиреЛ рддрд░рд┐рдХрд╛рдорд╛ рдкреНрд▓рд╕/рдорд╛рдЗрдирд╕ рд░рд╣рдиреЗрдЫ:

public ValueTask<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return new ValueTask<string>(val);
    return new ValueTask<string>(RequestById(id));
}

рдпрд╕ рдХреЛрдбрдХреЛ рдЯреБрдХреНрд░рд╛рд▓рд╛рдИ рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реМрдВ: рдпрджрд┐ рдХреНрдпрд╛рд╕рдорд╛ рдорд╛рди рдЫ рднрдиреЗ, рд╣рд╛рдореА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, рдЕрдиреНрдпрдерд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдЕрд░реНрдердкреВрд░реНрдг рдПрдХрдорд╛ рд▓рдкреЗрдЯрд┐рдиреЗрдЫред рдХрд▓рд┐рдЩ рдХреЛрдбрд▓реЗ рдпреЛ рдХреЛрдб рдХреБрди рдмрд╛рдЯреЛрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреНрдиреЗ рдХреБрд░рд╛рдХреЛ рд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрджреИрди: ValueTask, C# рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдЬрд╕реНрддреИ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗрдЫред

рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░рд╣рд░реВ: рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд╖реЗрдкрдг рд░рдгрдиреАрддрд┐рд╣рд░реВ рдкреНрд░рдмрдиреНрдз рдЧрд░реНрджреИ

рдЕрд░реНрдХреЛ API рдЬреБрди рдо рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрдХреНрд╖рд╛ рд╣реЛ рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░ рд░ рдпрд╕рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрдиред рдореИрд▓реЗ рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рд╕рдХреЗрдХреЛ рдЫреБ рдХрд┐ TPL рд╕рдБрдЧ рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реНрдиреЗ рд░рдгрдиреАрддрд┐рд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдЫред рддреНрдпрд╕реНрддрд╛ рд░рдгрдиреАрддрд┐рд╣рд░реВ TaskScheduler рд╡рд░реНрдЧрдХрд╛ рд╕рдиреНрддрд╛рдирд╣рд░реВрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫрдиреНред рддрдкрд╛рдИрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рд░рдгрдиреАрддрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред рд╕рдорд╛рдирд╛рдиреНрддрд░ рдПрдХреНрд╕реНрдЯреЗрдиреНрд╕рди рдПрдХреНрд╕реНрдЯреНрд░рд╛рд╕, Microsoft рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд, рддрд░ .NET рдХреЛ рднрд╛рдЧ рд╣реЛрдЗрди, рддрд░ Nuget рдкреНрдпрд╛рдХреЗрдЬрдХреЛ рд░реВрдкрдорд╛ рдЖрдкреВрд░реНрддрд┐ рдЧрд░рд┐рдпреЛред рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдХреЗрд╣реАрд▓рд╛рдИ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрдорд╛ рд╣реЗрд░реМрдВ:

  • CurrentThreadTaskScheduler - рд╣рд╛рд▓рдХреЛ рдереНрд░реЗрдбрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫ
  • LimitedConcurrencyLevelTaskSeduler - рдкрд░рд┐рдорд┐рддрд┐ N рджреНрд╡рд╛рд░рд╛ рдПрдХреИ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рд▓рд╛рдИ рд╕реАрдорд┐рдд рдЧрд░реНрджрдЫ, рдЬреБрди рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рдорд╛ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдиреНрдЫред
  • OrderedTaskScheduler тАФ LimitedConcurrencyLevelTaskScheduler(1) рдХреЛ рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдХреНрд░рдорд┐рдХ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫред
  • WorkStealingTaskScheduler - рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ рдХрд╛рдо рдЪреЛрд░реА рдХрд╛рд░реНрдп рд╡рд┐рддрд░рдг рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛ рдпреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдбрдкреВрд▓ рд╣реЛред .NET ThreadPool рдорд╛ рд╕рдмреИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╣реЛ, рдЬрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдПрдХ рднрд╛рдЧрдорд╛ рдпрд╕рдХреЛ рдУрднрд░рд▓реЛрдбрд┐рдЩ рд╡рд╛ рдЧрд▓рдд рдкреНрд░рдпреЛрдЧрд▓реЗ рдЕрд░реНрдХреЛрдорд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯрд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫ рднрдиреНрдиреЗ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпрд╕реНрддреЛ рджреЛрд╖ рдХреЛ рдХрд╛рд░рдг рдмреБрдЭреНрди рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рдЫред рддреНрдпреЛред ThreadPool рдХреЛ рдкреНрд░рдпреЛрдЧ рдЖрдХреНрд░рд╛рдордХ рд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реБрди рд╕рдХреНрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдордХрд╛ рднрд╛рдЧрд╣рд░реВрдорд╛ рдЫреБрдЯреНрдЯреИ WorkStealingTaskSchedulers рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрди рд╕рдХреНрдЫред
  • рдХрддрд╛рд░рдмрджреНрдз рдХрд╛рд░реНрдп рддрд╛рд▓рд┐рдХрд╛ - рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓рд╛рдо рдирд┐рдпрдо рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ
  • ThreadPerTaskScheduler - рдпрд╕рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдереНрд░реЗрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫред рдкреВрд░рд╛ рд╣реБрди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдкрдорд╛ рд▓рд╛рдореЛ рд╕рдордп рд▓рд╛рдЧреНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫред

рддреНрдпрд╣рд╛рдБ рдПрдХ рд░рд╛рдореНрд░реЛ рд╡рд┐рд╕реНрддреГрдд рдЫ рд▓реЗрдЦ рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯ рдмреНрд▓рдЧрдорд╛ TaskSchedulers рдХреЛ рдмрд╛рд░реЗрдорд╛ред

рдХрд╛рд░реНрдпрд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдмреИ рдХреБрд░рд╛рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдбрд┐рдмрдЧрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐, рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛрдорд╛ рдХрд╛рд░реНрдп рд╡рд┐рдиреНрдбреЛ рдЫред рдпрд╕ рд╕рдЮреНрдЭреНрдпрд╛рд▓рдорд╛ рддрдкрд╛рдИрд▓реЗ рдХрд╛рд░реНрдпрдХреЛ рд╣рд╛рд▓рдХреЛ рдЕрд╡рд╕реНрдерд╛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рд╣рд╛рд▓рдХреЛ рдХреЛрдбрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЗрдирдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реНред

.NET: рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩ рд░ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгрд╣рд░реВред рднрд╛рдЧ 1

PLinq рд░ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд╡рд░реНрдЧ

рдХрд╛рд░реНрдпрд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рднрдирд┐рдПрдХреЛ рд╕рдмреИ рдХреБрд░рд╛рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, .NET рдорд╛ рджреБрдИ рдердк рд░реЛрдЪрдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреН: PLinq (Linq2Parallel) рд░ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд╡рд░реНрдЧред рдкрд╣рд┐рд▓реЛрд▓реЗ рдзреЗрд░реИ рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рд╕рдмреИ Linq рдЕрдкрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рд╡рд╛рдЪрд╛ рдЧрд░реНрджрдЫред рдереНрд░реЗрдбрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ WithDegreeOfParallelism рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдкреНрд░рд╛рдп: рдпрд╕рдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореЛрдбрдорд╛ PLinq рд╕рдБрдЧ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЧрддрд┐ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдЧрд░реНрди рддрдкрд╛рдИрдВрдХреЛ рдбрд╛рдЯрд╛ рд╕реНрд░реЛрддрдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдмрд╛рд░реЗ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реБрдБрджреИрди, рдЕрд░реНрдХреЛрддрд░реНрдл, рдкреНрд░рдпрд╛рд╕рдХреЛ рд▓рд╛рдЧрдд рдзреЗрд░реИ рдХрдо рдЫ: рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ AsParallel рд╡рд┐рдзрд┐ рдХрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред Linq рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд░ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред рдпрд╕рдмрд╛рд╣реЗрдХ, рд╡рд┐рднрд╛рдЬрди рд╕рдВрдпрдиреНрддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрдкрд╛рдИрдВрдХреЛ рдбрд╛рдЯрд╛ рд╕реНрд░реЛрддрдХреЛ рдкреНрд░рдХреГрддрд┐ рдмрд╛рд░реЗ PLinq рд▓рд╛рдИ рдердк рдЬрд╛рдирдХрд╛рд░реА рдкрдард╛рдЙрди рд╕рдореНрднрд╡ рдЫред рддрдкрд╛рдИрдВ рдердк рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБ ╨╕ рдпрд╣рд╛рдБ.

рд╕рдорд╛рдирд╛рдиреНрддрд░ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧрд▓реЗ рд╕рдорд╛рдирд╛рдиреНрддрд░рдорд╛ рдлреЛрд░рдЪ рд╕рдЩреНрдХрд▓рди рдорд╛рд░реНрдлрдд рджреЛрд╣реЛрд░рд┐рдиреЗ, рд▓реВрдкрдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ, рд░ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдЖрд╣реНрд╡рд╛рдирдорд╛ рдмрд╣реБ рдкреНрд░рддрд┐рдирд┐рдзрд┐рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рдЧрдгрдирд╛ рдкреВрд░рд╛ рдирднрдПрд╕рдореНрдо рд╣рд╛рд▓рдХреЛ рдереНрд░реЗрдбрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░реЛрдХрд┐рдиреЗрдЫред рдереНрд░реЗрдбрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рд▓рд╛рдИ рдЕрдиреНрддрд┐рдо рддрд░реНрдХрдХреЛ рд░реВрдкрдорд╛ ParallelOptions рдкрд╛рд╕ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ TaskScheduler рд░ CancellationToken рдкрдирд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЬрдм рдореИрд▓реЗ рдореЗрд░реЛ рдкреНрд░рддрд┐рд╡реЗрджрдирдХрд╛ рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ рд░ рддреНрдпрд╕ рдкрдЫрд┐рдХреЛ рдореЗрд░реЛ рдХрд╛рдордХреЛ рдХреНрд░рдордорд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реЗрдХреЛ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдпреЛ рд▓реЗрдЦ рд▓реЗрдЦреНрди рдерд╛рд▓реЗрдВ, рддреНрдпрддрд┐ рдзреЗрд░реИ рд╣реБрдиреЗрдЫ рднрдиреНрдиреЗ рдореИрд▓реЗ рд╕реЛрдЪреЗрдХреЛ рдерд┐рдЗрдирдБред рдЕрдм, рдЬрдм рдореИрд▓реЗ рдпреЛ рд▓реЗрдЦ рдЯрд╛рдЗрдк рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдкрд╛рда рд╕рдореНрдкрд╛рджрдХрд▓реЗ рдорд▓рд╛рдИ рдирд┐рдиреНрджрд╛ рдЧрд░реНрджреИ рдкреГрд╖реНрда 15 рдЧрдПрдХреЛ рдмрддрд╛рдЙрдБрдЫ, рдо рдЕрдиреНрддрд░рд┐рдо рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд╕рдВрдХреНрд╖реЗрдк рдЧрд░реНрдиреЗрдЫреБред рдЕрдиреНрдп рдЪрд╛рд▓рд╣рд░реВ, рдПрдкреАрдЖрдИрд╣рд░реВ, рджреГрд╢реНрдп рдЙрдкрдХрд░рдгрд╣рд░реВ рд░ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдиреЗрдЫред

рдирд┐рд╖реНрдХрд░реНрд╖:

  • рдЖрдзреБрдирд┐рдХ рдкреАрд╕реАрд╣рд░реВрдХреЛ рд╕реНрд░реЛрддрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдереНрд░реЗрдб, рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреА рд░ рд╕рдорд╛рдирд╛рдиреНрддрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЬрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
  • .NET рд╕рдБрдЧ рдпреА рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдлрд░рдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреН
  • рддреА рд╕рдмреИ рдПрдХреИрдЪреЛрдЯрд┐ рджреЗрдЦрд╛ рдкрд░реНрджреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрд▓реЗ рдкреНрд░рд╛рдпрдГ рд╡рд┐рд░рд╛рд╕рддрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрдерд╛рдкрд┐, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкреНрд░рдпрд╛рд╕ рдмрд┐рдирд╛ рдкреБрд░рд╛рдиреЛ API рд▓рд╛рдИ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреНред
  • .NET рдорд╛ рдереНрд░реЗрдбрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛ рдереНрд░реЗрдб рд░ рдереНрд░реЗрдбрдкреБрд▓ рд╡рд░реНрдЧрд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░рд┐рдиреНрдЫ
  • Thread.Abort, Thread.Interrupt, рд░ Win32 API TerminateThread рд╡рд┐рдзрд┐рд╣рд░реВ рдЦрддрд░рдирд╛рдХ рдЫрдиреН рд░ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдБрджреИрдиред рдмрд░реБ, рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рдореЗрдХрд╛рдирд┐рдЬрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫ
  • рдкреНрд░рд╡рд╛рд╣ рдПрдХ рдмрд╣реБрдореВрд▓реНрдп рд╕реНрд░реЛрдд рд╣реЛ рд░ рдпрд╕рдХреЛ рдЖрдкреВрд░реНрддрд┐ рд╕реАрдорд┐рдд рдЫред рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛рдорд╛ рдереНрд░реЗрдбрд╣рд░реВ рд╡реНрдпрд╕реНрдд рд╣реБрдиреЗ рдЕрд╡рд╕реНрдерд╛рд╣рд░реВ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ TaskCompletionSource рд╡рд░реНрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ
  • рд╕рдорд╛рдирд╛рдиреНрддрд░ рд░ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдиреАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд░ рдЙрдиреНрдирдд .NET рдЙрдкрдХрд░рдгрд╣рд░реВ рдХрд╛рд░реНрдпрд╣рд░реВ рд╣реБрдиреНред
  • c# async/await рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрд▓реЗ рдЧреИрд░-рдмреНрд▓рдХрд┐рдЩ рдкрд░реНрдЦрд╛рдЗрдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ
  • рддрдкрд╛рдИрдВрд▓реЗ TaskScheduler-рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рддрд░рдг рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
  • ValueTask рд╕рдВрд░рдЪрдирд╛ рд╣рдЯ-рдкрд╛рде рд░ рдореЗрдореЛрд░реА-рдЯреНрд░рд╛рдлрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрди рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫ
  • рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд░ рдереНрд░реЗрдбрд╣рд░реВ рд╡рд┐рдиреНрдбреЛрд╣рд░реВрд▓реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХреЛрдб рдбрд┐рдмрдЧ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред
  • PLinq рдПрдЙрдЯрд╛ рд░рд╛рдореНрд░реЛ рдЙрдкрдХрд░рдг рд╣реЛ, рддрд░ рдпрд╕рдорд╛ рддрдкрд╛рдИрдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реБрди рд╕рдХреНрдЫ, рддрд░ рдпрд╕рд▓рд╛рдИ рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрдиреЗ рд╕рдВрдпрдиреНрддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
  • рдлреЗрд░рд┐ рдЬрд╛рд░реА рд░рд╛рдЦреМрдВрд▓рд╛тАж

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди