.NET: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЖрдгрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдиреАрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдзрдиреЗ. рднрд╛рдЧ 1

рдореА рдореВрд│ рд▓реЗрдЦ Habr рд╡рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдд рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдХреЙрд░реНрдкреЛрд░реЗрдЯрдордзреНрдпреЗ рдкреЛрд╕реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ.

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

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

рдкреНрд░рдХреНрд░рд┐рдпрд╛ - OS рдСрдмреНрдЬреЗрдХреНрдЯ, рдЖрдпрд╕реЛрд▓реЗрдЯреЗрдб рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдереНрд░реЗрдбреНрд╕ рдЖрд╣реЗрдд.
рдзрд╛рдЧрд╛ - рдПрдХ OS рдСрдмреНрдЬреЗрдХреНрдЯ, рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдПрдХрдХ, рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪрд╛ рднрд╛рдЧ, рдереНрд░реЗрдбреНрд╕ рдПрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рдореЗрдорд░реА рдЖрдгрд┐ рдЗрддрд░ рд╕рдВрд╕рд╛рдзрдиреЗ рдЖрдкрд╛рдкрд╕рд╛рдд рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рддрд╛рдд.
рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ - OS рдЧреБрдгрдзрд░реНрдо, рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
рдорд▓реНрдЯреА-рдХреЛрд░ - рдкреНрд░реЛрд╕реЗрд╕рд░рдЪреА рдорд╛рд▓рдорддреНрддрд╛, рдбреЗрдЯрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдЕрдиреЗрдХ рдХреЛрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ - рд╕рдВрдЧрдгрдХрд╛рдЪреА рдорд╛рд▓рдорддреНрддрд╛, рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░рд╕рд╣ рд╢рд╛рд░реАрд░рд┐рдХрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ тАФ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪрд╛ рдЧреБрдгрдзрд░реНрдо, рдЕрдиреЗрдХ рдереНрд░реЗрдбреНрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╡рд┐рддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛.
рд╕рдорд╛рдВрддрд░рддрд╛ - рд╡реЗрд│реЗрдЪреНрдпрд╛ рдкреНрд░рддрд┐ рдпреБрдирд┐рдЯрдордзреНрдпреЗ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдХреНрд░рд┐рдпрд╛ рд╢рд╛рд░реАрд░рд┐рдХрд░рд┐рддреНрдпрд╛ рдХрд░рдгреЗ
рдЕрд╕рд┐рдВрдХреНрд░реЛрдиреА - рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рди рдкрд╛рд╣рддрд╛ рдСрдкрд░реЗрд╢рдирдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА; рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рдирд┐рдХрд╛рд▓рд╛рд╡рд░ рдирдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ.

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

рд╕рд░реНрд╡ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдирд╛рд╣реАрдд рдЖрдгрд┐ рдХрд╛рд╣реАрдВрдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдореА рдФрдкрдЪрд╛рд░рд┐рдХрдкрдгреЗ рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╢рдмреНрджрд╛рд╡рд▓реАрдордзреНрдпреЗ рдирд╛рд╢реНрддрд╛ рд╢рд┐рдЬрд╡рдгреНрдпрд╛рдмрджреНрджрд▓ рдПрдХ рд░реВрдкрдХ рдЬреЛрдбреЗрди. рдпрд╛ рд░реВрдкрдХрд╛рдордзреНрдпреЗ рдирд╛рд╢реНрддрд╛ рд╢рд┐рдЬрд╡рд┐рдгреЗ рд╣реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ.

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

рдореА рдлрдХреНрдд 2 рд╣рд╛рдд рд╡рд╛рдкрд░реВрди рдСрдореНрд▓реЗрдЯ рд╢рд┐рдЬрд╡рд▓реЗ, рдЖрдгрд┐ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЬрд╛рд╕реНрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдСрдореНрд▓реЗрдЯ рдЪрд╛рдмреВрдХ рдорд╛рд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдгреА, рдПрдХрд╛рдЪ рд╡реЗрд│реА 3 рдСрдкрд░реЗрд╢рдиреНрд╕ рдЭрд╛рд▓реНрдпрд╛: рдСрдореНрд▓реЗрдЯ рдЪрд╛рдмрдХрд╛рдиреЗ рдорд╛рд░рдгреЗ, рдкреНрд▓реЗрдЯ рдкрдХрдбрдгреЗ, рддрд│рдгреНрдпрд╛рдЪреЗ рдкреЕрди рдЧрд░рдо рдХрд░рдгреЗ CPU рд╣рд╛ рд╕рдВрдЧрдгрдХрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╡реЗрдЧрд╡рд╛рди рднрд╛рдЧ рдЖрд╣реЗ, IO рдореНрд╣рдгрдЬреЗ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рд╕рд░реНрд╡рдХрд╛рд╣реА рдордВрджрд╛рд╡рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдПрдХ рдкреНрд░рднрд╛рд╡реА рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ IO рдХрдбреВрди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛рдирд╛ CPU рд▓рд╛ рдХрд╛рд╣реАрддрд░реА рд╡реНрдпрд╛рдкреВрди рдЯрд╛рдХрдгреЗ.

рд░реВрдкрдХ рдЪрд╛рд▓реВ рдареЗрд╡рдгреЗ:

  • рдЬрд░ рдСрдореНрд▓реЗрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдд, рдореА рдХрдкрдбреЗ рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рддрд░ рд╣реЗ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╕реЗрд▓. рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдореБрджреНрджрд╛: рд╕рдВрдЧрдгрдХ рд▓реЛрдХрд╛рдВрдкреЗрдХреНрд╖рд╛ рдпрд╛рдордзреНрдпреЗ рдмрд░реЗрдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗрдд.
  • рдЕрдиреЗрдХ рд╢реЗрдл рдЕрд╕рд▓реЗрд▓реЗ рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рд░реЗрд╕реНрдЯреЙрд░рдВрдЯрдордзреНрдпреЗ - рдПрдХ рдорд▓реНрдЯреА-рдХреЛрд░ рд╕рдВрдЧрдгрдХ.
  • рд╢реЙрдкрд┐рдВрдЧ рд╕реЗрдВрдЯрд░рдордзреАрд▓ рдлреВрдб рдХреЛрд░реНрдЯрдордзреНрдпреЗ рдЕрдиреЗрдХ рд░реЗрд╕реНрдЯреЙрд░рдВрдЯреНрд╕ - рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░

.NET рд╕рд╛рдзрдиреЗ

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

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

рдзрд╛рдЧрд╛ рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЗ

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

  • рдереНрд░реЗрдбрд╕реНрдЯрд╛рд░реНрдЯ - рдХреЛрдгрддреЗрд╣реА рдкреЕрд░рд╛рдореАрдЯрд░ рдирд╛рд╣реАрдд
  • ParametrizedThreadStart - рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рдПрдХрд╛ рдкреЕрд░рд╛рдореАрдЯрд░рд╕рд╣.

рд╕реНрдЯрд╛рд░реНрдЯ рдореЗрдердбрд▓рд╛ рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдирд╡реНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдереНрд░реЗрдбрдордзреНрдпреЗ рдбреЗрд▓рд┐рдЧреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рдЬрд░ рдкреЕрд░рд╛рдореЗрдЯреНрд░реАрдЬреНрдб рдереНрд░реЗрдбрд╕реНрдЯрд╛рд░реНрдЯ рдкреНрд░рдХрд╛рд░рд╛рдЪрд╛ рдкреНрд░рддрд┐рдирд┐рдзреА рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рд▓рд╛ рдкрд╛рд╕ рдХреЗрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯрд╛рд░реНрдЯ рдореЗрдердбрд▓рд╛ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдХреЛрдгрддреАрд╣реА рд╕реНрдерд╛рдирд┐рдХ рдорд╛рд╣рд┐рддреА рдкреНрд░рд╡рд╛рд╣рд╛рдд рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реА рдпрдВрддреНрд░рдгрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдереНрд░реЗрдб рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реЗ рдПрдХ рдорд╣рд╛рдЧ рдСрдкрд░реЗрд╢рди рдЖрд╣реЗ рдЖрдгрд┐ рдереНрд░реЗрдб рд╕реНрд╡рддрдГрдЪ рдПрдХ рдЬрдб рд╡рд╕реНрддреВ рдЖрд╣реЗ, рдХрдореАрддрдХрдореА рдХрд╛рд░рдг рддреЗ рд╕реНрдЯреЕрдХрд╡рд░ 1MB рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рддреЗ рдЖрдгрд┐ OS API рд╕рд╣ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

рдереНрд░реЗрдбрдкреВрд▓ рд╡рд░реНрдЧ рдкреВрд▓рдЪреА рд╕рдВрдХрд▓реНрдкрдирд╛ рджрд░реНрд╢рд╡рддреЛ. .NET рдордзреНрдпреЗ, рдереНрд░реЗрдб рдкреВрд▓ рд╣рд╛ рдЕрднрд┐рдпрд╛рдВрддреНрд░рд┐рдХреАрдЪрд╛ рдПрдХ рднрд╛рдЧ рдЖрд╣реЗ, рдЖрдгрд┐ Microsoft рдордзреАрд▓ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдиреА рддреЗ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦреВрдк рдкреНрд░рдпрддреНрди рдХреЗрд▓реЗ рдЖрд╣реЗрдд.

рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдкрдирд╛:

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реВ рдЭрд╛рд▓реНрдпрд╛рдкрд╛рд╕реВрди, рддреЗ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдордзреНрдпреЗ рд░рд╛рдЦреАрд╡ рдордзреНрдпреЗ рдЕрдиреЗрдХ рдереНрд░реЗрдб рддрдпрд╛рд░ рдХрд░рддреЗ рдЖрдгрд┐ рддреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдШреЗрдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдереНрд░реЗрдбреНрд╕ рд╡рд╛рд░рдВрд╡рд╛рд░ рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛рд╕, рдХреЙрд▓рд░рдЪреНрдпрд╛ рдЧрд░рдЬрд╛ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреВрд▓ рд╡рд┐рд╕реНрддреГрдд рд╣реЛрддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдпреЛрдЧреНрдп рд╡реЗрд│реА рдкреВрд▓рдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рд╡рд┐рдирд╛рдореВрд▓реНрдп рдереНрд░реЗрдб рдирд╕рддрд╛рдд, рддреЗрд╡реНрд╣рд╛ рддреЗ рдПрдХрддрд░ рдереНрд░реЗрдб рдкрд░рдд рдпреЗрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрд▓ рдХрд┐рдВрд╡рд╛ рдирд╡реАрди рддрдпрд╛рд░ рдХрд░реЗрд▓. рд╣реЗ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ рдХреА рдереНрд░реЗрдб рдкреВрд▓ рдХрд╛рд╣реА рдЕрд▓реНрдк-рдореБрджрддреАрдЪреНрдпрд╛ рдХреНрд░рд┐рдпрд╛рдВрд╕рд╛рдареА рдЙрддреНрддрдо рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдСрдкрд░реЗрд╢рдирдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдореНрд╣рдгреВрди рдЪрд╛рд▓рдгрд╛рд░реНтАНрдпрд╛ рдСрдкрд░реЗрд╢рдиреНрд╕рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╛рд╣реА.

рдкреВрд▓рдордзреВрди рдереНрд░реЗрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдПрдХ QueueUserWorkItem рдкрджреНрдзрдд рдЖрд╣реЗ рдЬреА WaitCallback рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзреА рд╕реНрд╡реАрдХрд╛рд░рддреЗ, рдЬреНрдпрд╛рдЪреА рд╕реНрд╡рд╛рдХреНрд╖рд░реА ParametrizedThreadStart рд╕рд╛рд░рдЦреАрдЪ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╕ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реЗ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ.

ThreadPool.QueueUserWorkItem(...);

RegisterWaitForSingleObject рд╣реА рдХрдореА-рдЬреНрдЮрд╛рдд рдереНрд░реЗрдб рдкреВрд▓ рдкрджреНрдзрдд рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ IO рдСрдкрд░реЗрд╢рдиреНрд╕ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рдпрд╛ рдкрджреНрдзрддреАрд▓рд╛ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдирд┐рдзреАрд▓рд╛ рдЬреЗрд╡реНрд╣рд╛ рд╡реЗрдЯрд╣рдБрдбрд▓ рдкрджреНрдзрддреАрдиреЗ рдкрд╛рд╕ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рддреЗрд╡реНрд╣рд╛ "рд░рд┐рд▓реАрдЭ" рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

ThreadPool.RegisterWaitForSingleObject(...)

.NET рдордзреНрдпреЗ рдПрдХ рдереНрд░реЗрдб рдЯрд╛рдЗрдорд░ рдЖрд╣реЗ рдЖрдгрд┐ рддреЛ WinForms/WPF рдЯрд╛рдЗрдорд░рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│рд╛ рдЖрд╣реЗ рдХрд╛рд░рдг рддреНрдпрд╛рдЪрд╛ рд╣рдБрдбрд▓рд░ рдкреВрд▓рдордзреВрди рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рдереНрд░реЗрдбрд╡рд░ рдХреЙрд▓ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓.

System.Threading.Timer

рдкреВрд▓рдордзреВрди рдереНрд░реЗрдбрд╡рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рдкреНрд░рддрд┐рдирд┐рдзреА рдкрд╛рдард╡рдгреНрдпрд╛рдЪрд╛ рдПрдХ рд╡рд┐рдЪрд┐рддреНрд░ рдорд╛рд░реНрдЧ рджреЗрдЦреАрд▓ рдЖрд╣реЗ - BeginInvoke рдкрджреНрдзрдд.

DelegateInstance.BeginInvoke

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

Kernel32.dll CreateThread

рдереНрд░реЗрдбреНрд╕ рдкрд╣рд╛рдгреЗ рдЖрдгрд┐ рдбреАрдмрдЧ рдХрд░рдгреЗ

рддреБрдореНрд╣реА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдереНрд░реЗрдбреНрд╕, рд╕рд░реНрд╡ рддреГрддреАрдп-рдкрдХреНрд╖ рдШрдЯрдХ рдЖрдгрд┐ .NET рдкреВрд▓ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдУрдЪреНрдпрд╛ рдереНрд░реЗрдбреНрд╕ рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдбреАрдмрдЧ рдЖрдгрд┐ рдмреНрд░реЗрдХ рдореЛрдбрдордзреНрдпреЗ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ рд╣реА рд╡рд┐рдВрдбреЛ рдереНрд░реЗрдб рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрд▓. рдпреЗрдереЗ рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдбрдЪреА рд╕реНрдЯреЕрдХ рдирд╛рд╡реЗ рдЖрдгрд┐ рдкреНрд░рд╛рдзрд╛рдиреНрдпрдХреНрд░рдо рд╕рд╣рдЬрддреЗрдиреЗ рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдбреАрдмрдЧрд┐рдВрдЧрд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдбрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░реВ рд╢рдХрддрд╛. рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕рдЪреНрдпрд╛ рдкреНрд░рд╛рдпреЛрд░рд┐рдЯреА рдкреНрд░реЙрдкрд░реНрдЯреАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, рддреБрдореНрд╣реА рдереНрд░реЗрдбрдЪрд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдпрдХреНрд░рдо рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛, рдЬреЗ OC рдЖрдгрд┐ CLR рд▓рд╛ рдереНрд░реЗрдбреНрд╕ рджрд░рдореНрдпрд╛рди рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡реЗрд│ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛рдирд╛ рдПрдХ рд╢рд┐рдлрд╛рд░рд╕ рдореНрд╣рдгреВрди рд╕рдордЬреЗрд▓.

.NET: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЖрдгрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдиреАрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдзрдиреЗ. рднрд╛рдЧ 1

рдХрд╛рд░реНрдп рд╕рдорд╛рдВрддрд░ рд▓рд╛рдпрдмреНрд░рд░реА

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

  • async рд╣реЗ рдЯрд╛рд╕реНрдХ рдХрд┐рдВрд╡рд╛ рд╡реНрд╣реЙрдЗрдб рдкрд░рдд рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рдкрджреНрдзрддреАрдЪреЗ рд╕реБрдзрд╛рд░рдХ рдЖрд╣реЗ
  • рдЖрдгрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реЗ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рд╡реЗрдЯрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдЖрд╣реЗ.

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

рдЯрд╛рд╕реНрдХ рд▓рд╛рдБрдЪ рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░реНрдпрд╛рдп рдкрд╛рд╣реВ. рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рдЖрдореНрд╣реА рдПрдХ рдирд╡реАрди рдХрд╛рд░реНрдп рддрдпрд╛рд░ рдХрд░рддреЛ рдЬреЗ рдХрд╛рд╣реАрд╣реА рдЙрдкрдпреБрдХреНрдд рдирд╛рд╣реА (рдереНрд░реЗрдб.рд╕реНрд▓реАрдк(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
}

рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ:

  • рд▓рд╛рдБрдЧрд░рдирд┐рдВрдЧ рд╣рд╛ рдПрдХ рдЗрд╢рд╛рд░рд╛ рдЖрд╣реЗ рдХреА рдХрд╛рд░реНрдп рддреНрд╡рд░реАрдд рдкреВрд░реНрдг рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА, рдпрд╛рдЪрд╛ рдЕрд░реНрде рдкреВрд▓рдордзреВрди рдзрд╛рдЧрд╛ рди рдШреЗрдгреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЗрддрд░рд╛рдВрдирд╛ рд╣рд╛рдиреА рдкреЛрд╣реЛрдЪрд╡реВ рдирдпреЗ рдореНрд╣рдгреВрди рдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡реЗрдЧрд│рд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ.
  • AttachedToParent - рдХрд╛рд░реНрдпреЗ рдкрджрд╛рдиреБрдХреНрд░рдорд╛рдд рдорд╛рдВрдбрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдЬрд░ рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░рд▓рд╛ рдЧреЗрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдХрд╛рд░реНрдп рдЕрд╢рд╛ рд╕реНрдерд┐рддреАрдд рдЕрд╕реВ рд╢рдХрддреЗ рдЬрд┐рдереЗ рддреНрдпрд╛рдиреЗ рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рдХреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛ рдореБрд▓рд╛рдВрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдд рдЖрд╣реЗ.
  • PreferFairness - рдореНрд╣рдгрдЬреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рдкрд╛рдард╡рд▓реЗрд▓реА рдХрд╛рд░реНрдпреЗ рдирдВрддрд░ рдкрд╛рдард╡рдгреНрдпрд╛рдЖрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрдИрд▓. рдкрд░рдВрддреБ рд╣реА рдлрдХреНрдд рдПрдХ рд╢рд┐рдлрд╛рд░рд╕ рдЖрд╣реЗ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдорд╛рдВрдЪреА рд╣рдореА рдирд╛рд╣реА.

рдпрд╛ рдкрджреНрдзрддреАрд▓рд╛ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реЗ рджреБрд╕рд░реЗ рдкреЕрд░рд╛рдореАрдЯрд░ рдореНрд╣рдгрдЬреЗ CancellationToken. рдСрдкрд░реЗрд╢рди рд╕реБрд░реВ рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ рд░рджреНрдж рдХрд░рдгреЗ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдХреЛрдб рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд╕реНрдерд┐рддреАрд╕рд╛рдареА рдЪреЗрдХрдиреЗ рднрд░рд▓реЗрд▓рд╛ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдХреЛрдгрддреЗрд╣реА рдЪреЗрдХ рдирд╕рд▓реНрдпрд╛рд╕, CancellationTokenSource рдСрдмреНрдЬреЗрдХреНрдЯрд╡рд░ рдХреЙрд▓ рдХреЗрд▓реЗрд▓реА рд░рджреНрдж рдкрджреНрдзрдд рдХрд╛рд░реНрдп рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдкреВрд░реНрд╡реАрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреЗ рдерд╛рдВрдмрд╡реВ рд╢рдХреЗрд▓.

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

рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрдЯрд░ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯрд╛рд╕реНрдХрд╡рд░ рд▓рд╛рдЧреВ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреНрдпрд╛рдЪреНрдпрд╛ рдирдВрддрд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдХреЛрдб, рдЬрд░ рдПрдЦрд╛рджрд╛ рдЕрд╕реЗрд▓ рддрд░, рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдХреЛрдбрдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд (рдмрд╣реБрддреЗрдХрджрд╛ рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреНрдпрд╛рдЪ рдереНрд░реЗрдбрд╡рд░) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓.

рдкрджреНрдзрдд async рд╢реВрдиреНрдп рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ, рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрдЯрд░ рд╡рд╛рдкрд░реВ рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рдгрд╛рд░ рдирд╛рд╣реА. рдЕрд╕реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкрджреНрдзрдд рдХрд╛рд░реНрдп рдкрд░рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. async void рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреА рдЕрдЧрджреА рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗрдд: рдПрдХ рдирд┐рдпрдо рдореНрд╣рдгреВрди, рд╣реЗ рдЗрд╡реНрд╣реЗрдВрдЯ рд╣рдБрдбрд▓рд░ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдкрджреНрдзрддреА рдЖрд╣реЗрдд рдЬреНрдпрд╛ рдЕрдЧреНрдирд┐рд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдЖрдгрд┐ рддрддреНрддреНрд╡ рд╡рд┐рд╕рд░рддрд╛рдд. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреЗрд╡рд│ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рд╕рдорд╛рдкреНрддреАрдкрд░реНрдпрдВрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреАрдЪ рджреЗрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреАрд▓ рдкрд░рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

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

рдЖрдкрдг рдПрдЦрд╛рджреЗ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╢реА рдХрд░реВ рд╢рдХрддрд╛ рдпрд╛рд╡рд░ рдереЛрдбреЗ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛. рдЕрдкреЗрдХреНрд╖рд╛ рд╕рд╢рд░реНрдд рдХреЗрд╡реНрд╣рд╛ рдкреВрд░реНрдг рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рддреА рд╕рд╢рд░реНрдд рд░реАрддреАрдиреЗ рдХрдзреА рдХреЗрд▓реА рдЬрд╛рддреЗ рдпрд╛рд╡рд░ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрд╕рд╣ рдЦрд╛рд▓реА рдХреЛрдбрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ.

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 рд╡рд╛рдкрд░рддрд╛рдирд╛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдбрдордзреАрд▓ рддреНрд░реБрдЯреА рд╣рд╛рддрд╛рд│рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ - рддреЗ рдХреЛрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрд╕рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗрдЪ рд╡рд╛рдЧрддрд╛рдд. рдЖрдореНрд╣реА рдЯрд╛рд╕реНрдХрдордзреНрдпреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡реЗрдЯ рдПрдХреНрд╕реЙрд░реНрд╕рд┐рдЭрдо рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рд╕, рдореВрд│ рдЕрдкрд╡рд╛рдж рдПрдХреВрдг рдЕрдкрд╡рд╛рджрд╛рдд рдмрджрд▓рддреЛ, рдЙрджрд╛. рдЕрдкрд╡рд╛рдж рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ InnerException рдкреНрд░рдХрд╛рд░ рддрдкрд╛рд╕рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ C# рдЬрдЧрд╛рдордзреНрдпреЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЕрдЪ рдмреНрд▓реЙрдХреНрд╕рдЪреНрдпрд╛ рд╕рд╛рдЦрд│реАрдРрд╡рдЬреА рдПрдХрд╛ рдХреЕрдЪ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╕реНрд╡рддрдГрд▓рд╛ рдЗрдл рдЪреЗрди рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдХрд┐рдВрд╡рд╛ рдмрд╛рдВрдзрддрд╛рдирд╛ рдХреЕрдЪ рд╡рд╛рдкрд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓.

рддрд┐рд╕рд░реА рдЖрдгрд┐ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдгреЗ рджреЗрдЦреАрд▓ рддреНрдпрд╛рдЪ рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдЦрд░рд╛рдм рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реА рдЖрд╣реЗрдд рдЖрдгрд┐ рд╕рд░реНрд╡ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд.

рдЯрд╛рд╕реНрдХрдЪреНрдпрд╛ рдЧрдЯрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рд╡реНрд╣реЗрдирдПрдиреНрдиреА рдЖрдгрд┐ рд╡реНрд╣реЗрди рдСрд▓ рдкрджреНрдзрддреА рдЕрддреНрдпрдВрдд рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗрдд; рддреЗ рдЯрд╛рд╕реНрдХрдЪрд╛ рдПрдХ рдЧрдЯ рдПрдХрд╛рдордзреНрдпреЗ рдЧреБрдВрдбрд╛рд│рддрд╛рдд, рдЬреЗ рдПрдХрддрд░ рдЧрдЯрд╛рддреАрд▓ рдЯрд╛рд╕реНрдХ рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдЯреНрд░рд┐рдЧрд░ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛ рд╕рд░реНрд╡рд╛рдВрдиреА рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рд╡рд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреАрд▓.

рдзрд╛рдЧреЗ рдерд╛рдВрдмрд╡рдд рдЖрд╣реЗрдд

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

рд╡реНрдпрддреНрдпрдп рдкрджреНрдзрдд рдЕрдзрд┐рдХ рдЕрдВрджрд╛рдЬрд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рд╣реЗ рдЕрдкрд╡рд╛рджрд╛рдиреЗ рдереНрд░реЗрдбрдордзреНрдпреЗ рд╡реНрдпрддреНрдпрдп рдЖрдгреВ рд╢рдХрддреЗ ThreadInterruptedException рдХреЗрд╡рд│ рддреНрдпрд╛ рдХреНрд╖рдгрд╛рдВрдордзреНрдпреЗ рдЬреЗрд╡реНрд╣рд╛ рдзрд╛рдЧрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддреАрдд рдЕрд╕рддреЛ. рд╡реЗрдЯрд╣рдБрдбрд▓, рд▓реЙрдХ рдХрд┐рдВрд╡рд╛ рдереНрд░реЗрдб.рд╕реНрд▓реАрдк рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдд рдЕрд╕рддрд╛рдирд╛ рд▓рдЯрдХрдд рдЕрд╕рддрд╛рдирд╛ рддреЗ рдпрд╛ рд╕реНрдерд┐рддреАрдд рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ.

рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реЗ рджреЛрдиреНрд╣реА рдкрд░реНрдпрд╛рдп рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рддрддреЗрдореБрд│реЗ рдЦрд░рд╛рдм рдЖрд╣реЗрдд. рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд░рдЪрдирд╛ рд╡рд╛рдкрд░рдгреЗ рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рдЖрдгрд┐ рд╡рд░реНрдЧ рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрдирд╕реНрд░реЛрдд. рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ: рдХреЕрдиреНрд╕рд▓реЗрд╢рдирдЯреЛрдХрдирд╕реЛрд░реНрд╕ рдХреНрд▓рд╛рд╕рдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЬреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ рддреЛрдЪ рдпрд╛ рдкрджреНрдзрддреАрд▓рд╛ рдХреЙрд▓ рдХрд░реВрди рдСрдкрд░реЗрд╢рди рдерд╛рдВрдмрд╡реВ рд╢рдХрддреЛ. рд░рджреНрдж рдХрд░рд╛. рдСрдкрд░реЗрд╢рдирд▓рд╛ рдлрдХреНрдд рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рджрд┐рд▓реЗ рдЬрд╛рддреЗ. CancellationToken рдорд╛рд▓рдХ рд╕реНрд╡рддрдГ рдСрдкрд░реЗрд╢рди рд░рджреНрдж рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рдСрдкрд░реЗрд╢рди рд░рджреНрдж рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рддреЗ рдлрдХреНрдд рддрдкрд╛рд╕реВ рд╢рдХрддрд╛рдд. рдпрд╛рд╕рд╛рдареА рдмреБрд▓рд┐рдпрди рдкреНрд░реЙрдкрд░реНрдЯреА рдЖрд╣реЗ рд░рджреНрдж рдХрд░рдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЖрд╣реЗ рдЖрдгрд┐ рдкрджреНрдзрдд ThrowIfCancel рд╡рд┐рдирдВрддреА рдХреЗрд▓реА. рдирдВрддрд░рдЪреЗ рдЕрдкрд╡рд╛рдж рдлреЗрдХрддреАрд▓ TaskCancelledException рдХреЕрдиреНрд╕рд▓реЗрд╢рдирдЯреЛрдХрдирдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рдХреЕрдиреНрд╕рд▓ рдкрджреНрдзрдд рдХреЙрд▓ рдХреЗрд▓реА рдЕрд╕рд▓реНрдпрд╛рд╕ рдкреЕрд░реЛрдЯ рдХреЗрд▓реА рдЬрд╛рдд рдЖрд╣реЗ. рдЖрдгрд┐ рд╣реА рдкрджреНрдзрдд рдореА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ. рдХреЛрдгрддреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдЕрдкрд╡рд╛рдж рдСрдкрд░реЗрд╢рди рд░рджреНрдж рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдпрд╛рд╡рд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд│рд╡реВрди рдорд╛рдЧреАрд▓ рдкрд░реНрдпрд╛рдпрд╛рдВрдкреЗрдХреНрд╖рд╛ рд╣реА рд╕реБрдзрд╛рд░рдгрд╛ рдЖрд╣реЗ.

рдереНрд░реЗрдб рдерд╛рдВрдмрд╡рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рдХреНрд░реВрд░ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ Win32 API TerminateThread рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрд▓ рдХрд░рдгреЗ. рд╣реЗ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ CLR рдЪреЗ рд╡рд░реНрддрди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрд╕реВ рд╢рдХрддреЗ. MSDN рд╡рд░ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдмрджреНрджрд▓ рдЦрд╛рд▓реАрд▓ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ: "TerminateThread рд╣реЗ рдПрдХ рдзреЛрдХрд╛рджрд╛рдпрдХ рдлрдВрдХреНрд╢рди рдЖрд╣реЗ рдЬреЗ рдХреЗрд╡рд│ рдЕрддреНрдпрдВрдд рдЕрддреНрдпрдВрдд рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рд╡реЗ. "

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

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

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

рд╣реЗ рдлрдХреНрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдЕрдВрдЧрднреВрдд рдкреНрд░рдХрд╛рд░рд╛рдВрд╕рд╣ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЛрдгрддрд╛рд╣реА рдЬреБрдирд╛ рдкреНрд░рдХрд▓реНрдк рдлрдХреНрдд BeginDoSomething рдкрджреНрдзрддреАрдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддреЛ рдЬреНрдпрд╛ IAsyncResult рдЖрдгрд┐ EndDoSomething рдкрджреНрдзрддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛рдд.

TaskCompletionSource рдХреНрд▓рд╛рд╕ рд╡рд╛рдкрд░реВрди Legacy API рд▓рд╛ Task Based рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛

рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рджреБрд╕рд░реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рд╕рд╛рдзрди рдореНрд╣рдгрдЬреЗ рд╡рд░реНрдЧ TaskCompletionSource. рдлрдВрдХреНрд╢рдиреНрд╕, рдЙрджреНрджреЗрд╢ рдЖрдгрд┐ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рддреЗ рдереНрд░реЗрдбрдкреВрд▓ рдХреНрд▓рд╛рд╕рдЪреНрдпрд╛ RegisterWaitForSingleObject рдкрджреНрдзрддреАрдЪреА рдЖрдард╡рдг рдХрд░реВрди рджреЗрдгрд╛рд░реЗ рдЕрд╕реВ рд╢рдХрддреЗ, рдЬреНрдпрд╛рдмрджреНрджрд▓ рдореА рд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ. рд╣рд╛ рд╡рд░реНрдЧ рд╡рд╛рдкрд░реВрди, рддреБрдореНрд╣реА рдЯрд╛рд╕реНрдХрдордзреНрдпреЗ рдЬреБрдиреЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ API рд╕рд╣рдЬ рдЖрдгрд┐ рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ рдЧреБрдВрдбрд╛рд│реВ рд╢рдХрддрд╛.

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

TaskCompletionSource рдЗрд╡реНрд╣реЗрдВрдЯ рдореЙрдбреЗрд▓рдЪреНрдпрд╛ рдЖрд╕рдкрд╛рд╕ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рдЯрд╛рд╕реНрдХ рдЖрдгрд┐ рд▓реАрдЧреЗрд╕реА API рдЧреБрдВрдбрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗ. рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдЪреЗ рд╕рд╛рд░ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ: рдпрд╛ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдЯрд╛рд╕реНрдХ рдкреНрд░рдХрд╛рд░рдЪреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдорд╛рд▓рдорддреНрддрд╛ рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪреА рд╕реНрдерд┐рддреА SetResult, SetException рдЗрддреНрдпрд╛рджреА TaskCompletionSource рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдВрджреНрд╡рд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рдЬреНрдпрд╛ рдард┐рдХрд╛рдгреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрдЯрд░рд▓рд╛ рдпрд╛ рдЯрд╛рд╕реНрдХрд╕рд╛рдареА рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ, рддреЗ рдХрд╛рд░реНрдп рдкреВрд░реНрдгрддреНрд╡ рд╕реНрддреНрд░реЛрддрд╛рд╡рд░ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреАрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрдкрд╡рд╛рджрд╛рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдХрд┐рдВрд╡рд╛ рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдИрд▓. рд╣реЗ рдЕрджреНрдпрд╛рдк рд╕реНрдкрд╖реНрдЯ рдирд╕рд▓реНрдпрд╛рд╕, рдпрд╛ рдХреЛрдбрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ рдпрд╛, рдЬреЗрдереЗ рдХрд╛рд╣реА рдЬреБрдиреЗ EAP API рдЯрд╛рд╕реНрдХрдордзреНрдпреЗ рдЯрд╛рд╕реНрдХ рдХреЙрдореНрдкреНрд▓реЗрд╢рдирд╕реНрд░реЛрдд рд╡рд╛рдкрд░реВрди рдЧреБрдВрдбрд╛рд│рд▓реЗ рдЖрд╣реЗ: рдЬреЗрд╡реНрд╣рд╛ рдЗрд╡реНрд╣реЗрдВрдЯ рд╕реБрд░реВ рд╣реЛрдИрд▓, рддреЗрд╡реНрд╣рд╛ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╕реНрдерд┐рддреАрдд рдареЗрд╡рд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрдЯрд░рд▓рд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓реА рдкрджреНрдзрдд рдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рд╣реЛрдИрд▓ рдкрд░рд┐рдгрд╛рдо.

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, рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рдЗрд╡реНрд╣реЗрдВрдЯрдЪреА рддрдХреНрд░рд╛рд░ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рд╕реНрдерд┐рддреА рдкрд░рдд рдХрд░реВ рд╢рдХрддреЗ. рд╡реЗрдмрд╕реЙрдХреЗрдЯрдЪреНрдпрд╛ рдХрд╛рд│рд╛рдкреВрд░реНрд╡реА рдХрд┐рдВрд╡рд╛ рд╣реЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░рдгреЗ рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдЕрд╢рдХреНрдп рдЕрд╕рддрд╛рдирд╛ HTTP рдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рд╕рд░реНрд╡ API рд╣реЗ рдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ. рдХреНрд▓рд╛рдпрдВрдЯ HTTP рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддреЛ. HTTP рд╕рд░реНрд╡реНрд╣рд░ рд╕реНрд╡рддрдГ рдХреНрд▓рд╛рдпрдВрдЯрд╢реА рд╕рдВрдкреНрд░реЗрд╖рдг рд╕реБрд░реВ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рдЯрд╛рдпрдорд░ рд╡рд╛рдкрд░реВрди рд╕рд░реНрд╡реНрд╣рд░рдЪреЗ рдорддрджрд╛рди рдХрд░рдгреЗ рд╣рд╛ рдПрдХ рд╕реЛрдкрд╛ рдЙрдкрд╛рдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдпрд╛рдореБрд│реЗ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддреЛ рдЖрдгрд┐ рд╕рд░рд╛рд╕рд░реА TimerInterval / 2 рд╡рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд▓рдВрдм рд╣реЛрддреЛ. рд╣реЗ рдЬрд╛рдгреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рд▓рд╛рдБрдЧ рдкреЛрд▓рд┐рдВрдЧ рдирд╛рд╡рд╛рдЪреА рдпреБрдХреНрддреА рд╢реЛрдзрдгреНрдпрд╛рдд рдЖрд▓реА, рдЬреНрдпрд╛рдордзреНрдпреЗ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рд╕ рдЙрд╢реАрд░ рдХрд░рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛рд▓рдмрд╛рд╣реНрдп рд╣реЛрдИрдкрд░реНрдпрдВрдд рдХрд┐рдВрд╡рд╛ рдПрдЦрд╛рджреА рдШрдЯрдирд╛ рдШрдбреЗрдкрд░реНрдпрдВрдд рд╕рд░реНрд╡реНрд╣рд░. рдЬрд░ рдШрдЯрдирд╛ рдШрдбрд▓реА рдЕрд╕реЗрд▓, рддрд░ рддреНрдпрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ, рдирд╕рд▓реНрдпрд╛рд╕, рдкреБрдиреНрд╣рд╛ рд╡рд┐рдирдВрддреА рдкрд╛рдард╡рд┐рд▓реА рдЬрд╛рддреЗ.

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 рдСрдкрд░реЗрдЯрд░, yield return operator рдкреНрд░рдорд╛рдгреЗ, рдкрджреНрдзрддреАрддреВрди рдПрдХ рд╕реНрдЯреЗрдЯ рдорд╢реАрди рддрдпрд╛рд░ рдХрд░рддрд╛рдд, рдЖрдгрд┐ рд╣реЗ рдирд╡реАрди рдСрдмреНрдЬреЗрдХреНрдЯрдЪреА рдирд┐рд░реНрдорд┐рддреА рдЖрд╣реЗ, рдЬреЗ рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдирд╕рддреЗ, рдкрд░рдВрддреБ рдХреНрд╡рдЪрд┐рдд рдкреНрд░рд╕рдВрдЧреА рддреЗ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВ рд╢рдХрддреЗ. рд╣реЗ рдХреЗрд╕ рдПрдХ рдкрджреНрдзрдд рдЕрд╕реВ рд╢рдХрддреЗ рдЬреНрдпрд╛рд▓рд╛ рдЦрд░реЛрдЦрд░ рдЕрдиреЗрдХрджрд╛ рдХреЙрд▓ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЖрдореНрд╣реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рджрд╣рд╛рдкрдЯ рдЖрдгрд┐ рд╢реЗрдХрдбреЛ рд╣рдЬрд╛рд░реЛ рдХреЙрд▓рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд. рдЬрд░ рдЕрд╢реА рдкрджреНрдзрдд рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рд▓рд┐рд╣рд┐рд▓реА рдЧреЗрд▓реА рдЕрд╕реЗрд▓ рдХреА рдмрд╣реБрддреЗрдХ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рддреА рд╕рд░реНрд╡ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрджреНрдзрддреАрдВрдирд╛ рдорд╛рдЧреЗ рдЯрд╛рдХреВрди рдирд┐рдХрд╛рд▓ рджреЗрддреЗ, рддрд░ .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);
}

рдЦрд░рдВрдЪ, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЗрд╖реНрдЯрддрдо рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд╣реЙрдЯ-рдкрд╛рде рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреЗ, рдореНрд╣рдгрдЬреЗ, рдЬреАрд╕реАрд╡рд░ рдХреЛрдгрддреЗрд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд╛рдЯрдк рдЖрдгрд┐ рд▓реЛрдб рди рдХрд░рддрд╛ рд╢рдмреНрджрдХреЛрд╖рд╛рддреВрди рдореВрд▓реНрдп рдорд┐рд│рд╡рдгреЗ, рддрд░ рдЕрд╢рд╛ рджреБрд░реНрдорд┐рд│ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдбреЗрдЯрд╛рд╕рд╛рдареА 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));
}

рдЪрд▓рд╛ рдпрд╛ рдХреЛрдбрдЪреНрдпрд╛ рддреБрдХрдбреНрдпрд╛рд╡рд░ рдмрд╛рд░рдХрд╛рдИрдиреЗ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛: рдХреЕрд╢реЗрдордзреНрдпреЗ рдореВрд▓реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдПрдХ рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХрд░рддреЛ, рдЕрдиреНрдпрдерд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдЕрд░реНрдердкреВрд░реНрдг рдордзреНрдпреЗ рдЧреБрдВрдбрд╛рд│рд▓реЗ рдЬрд╛рдИрд▓. рд╣рд╛ рдХреЛрдб рдХреЛрдгрддреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдпрд╛рдЪреА рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдбрд▓рд╛ рдкрд░реНрд╡рд╛ рдирд╛рд╣реА: рд╡реНрд╣реЕрд▓реНрдпреВрдЯрд╛рд╕реНрдХ, C# рд╕рд┐рдВрдЯреЕрдХреНрд╕рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдкреНрд░рдорд╛рдгреЗрдЪ рд╡рд╛рдЧреЗрд▓.

рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░: рдЯрд╛рд╕реНрдХ рд▓реЙрдиреНрдЪ рдзреЛрд░рдгреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ

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

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

рдЫрд╛рди рддрдкрд╢реАрд▓рд╡рд╛рд░ рдЖрд╣реЗ рд▓реЗрдЦ рдорд╛рдпрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдмреНрд▓реЙрдЧрд╡рд░реАрд▓ TaskSchedulers рдмрджреНрджрд▓.

рдЯрд╛рд╕реНрдХрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪреНрдпрд╛ рд╕реЛрдпреАрд╕реНрдХрд░ рдбреАрдмрдЧрд┐рдВрдЧрд╕рд╛рдареА, рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдУрдордзреНрдпреЗ рдЯрд╛рд╕реНрдХ рд╡рд┐рдВрдбреЛ рдЖрд╣реЗ. рдпрд╛ рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ рддреБрдореНрд╣реА рдХрд╛рд░реНрдпрд╛рдЪреА рд╕рджреНрдпрд╕реНрдерд┐рддреА рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдХреЛрдбрдЪреНрдпрд╛ рд╕рдзреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдУрд│реАрд╡рд░ рдЬрд╛рдК рд╢рдХрддрд╛.

.NET: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЖрдгрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдиреАрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдзрдиреЗ. рднрд╛рдЧ 1

PLinq рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░ рд╡рд░реНрдЧ

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

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

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

рдЬреЗрд╡реНрд╣рд╛ рдореА рдорд╛рдЭреНрдпрд╛ рдЕрд╣рд╡рд╛рд▓рд╛рддреАрд▓ рд╕рд╛рдордЧреНрд░реА рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдорд╛рдЭреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдЧреЛрд│рд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдорд╛рд╣рд┐рддреАрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдирд╡реНрд╣рддреЗ рдХреА рддреЗ рдЗрддрдХреЗ рдЕрд╕реЗрд▓. рдЖрддрд╛, рдЬреЗрд╡реНрд╣рд╛ рдореА рд╣рд╛ рд▓реЗрдЦ рдЯрд╛рдИрдк рдХрд░рдд рдЕрд╕рд▓реЗрд▓рд╛ рдордЬрдХреВрд░ рд╕рдВрдкрд╛рджрдХ рдорд▓рд╛ рдирд┐рдВрджрдиреАрдпрдкрдгреЗ рд╕рд╛рдВрдЧрддреЛ рдХреА рдкреГрд╖реНрда 15 рдЧреЗрд▓реЗ рдЖрд╣реЗ, рддреЗрд╡реНрд╣рд╛ рдореА рдЕрдВрддрд░рд┐рдо рдирд┐рдХрд╛рд▓рд╛рдВрдЪрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗрдИрди. рдЗрддрд░ рдпреБрдХреНрддреНрдпрд╛, API, рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рдЯреВрд▓реНрд╕ рдЖрдгрд┐ рддреЛрдЯреЗ рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓.

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛