рдпрд╣ рд▓реЗрдЦ рдХрд╛рдлреА рдкреНрд░рд╛рдЪреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдирд╣реАрдВ рдЦреЛрдИ рд╣реИред рдЬрдм рдпрд╣ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЖрдорддреМрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореИрдВрдиреЗ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред
рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рд░рд╛рдЬреНрдп рд╣реИ, рдЬреЛ рдорд╕реЛрдЪрд╡рд╛рдж рдХреА рд▓рд╛рд▓рд╕рд╛ рдХреЗ рд╕рд╛рде рд╣реИ - рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЧреИрд░-рд░реИрдЦрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рд╕рдордп, рдЭреБрдХрд╛рд╡ рдФрд░ рдорд╛рдирд╕рд┐рдХ рдХреНрд╖рдорддрд╛ рдереАред Microsoft .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, C # рдФрд░ Visual Basic рдиреЗ рд╣рдо рд╕рднреА рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓рд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдореГрддреНрдпреБрджрд╛рддрд╛ рдЕрдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреЙрд▓рдмреИрдХ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдорд╛рд░реНрд╢рд┐рдВрдЧ рдХреЛрдб рдирд╣реАрдВред рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо рдпрд╛ рдЕрдкрд╡рд╛рдж рдХреИрд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреНрд░рд┐рдХреНрд╕ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рдФрд░ рд╕рд┐рд░рджрд░реНрдж рдирд╣реАрдВ рд╣реИред
рдмреЗрд╢рдХ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдЗрд╕ MSDN рдореИрдЧрдЬрд╝реАрди [ OCTOBER 2011] рдореЗрдВ рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ рдФрд░ рдореИрдбреНрд╕ рдЯреЙрд░реНрдЧреЗрд░реЗрди рдХреЗ рд▓реЗрдЦ рджреЗрдЦреЗрдВ), рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рднрд╛рд╖рд╛ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЫрд┐рдкреА рд╣реБрдИ рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рд▓рд╛рдЧрдд рдирдЧрдгреНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкреЗрдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрдирдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рдХрд░рдиреЗ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд▓рд╛рдЧрддреЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВред C # рдФрд░ Visual Basic рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЫреЛрдЯреА рд▓рд╛рдЧрддреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрдардиреАрдп рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрдкреЛрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдирд╛рдо рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЬреНрдЮрд╛рди рд╣реИ рдЬреЛ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдирд┐рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрд▓реЗрдЦ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг 4.5 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЕрдВрддрд┐рдо рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╕реЛрдЪ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рджрд╢рдХреЛрдВ рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрддреНрдкрд╛рджрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ C #, Visual Basic, F # рдФрд░ C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдЕрдиреБрднрд╡ рдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд▓рд╛рдЧрддреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдХрд╛рд╕ рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрд┐рдлрд╛рдпрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рд╡рд┐рдзрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдмрд┐рдВрджреБ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдХреЛрдб рдХреЛ рдЫреЛрдЯреЗ, рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВред рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХрд╛ рд╕реЛрдЪ рдореЙрдбрд▓ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╕реЛрдЪ рдХрд╛ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрдирдХреЗ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд╕рд╛рде C # рдФрд░ Visual Basic рдпрд╣ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдЗрд╕рдХреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдордХрдХреНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЙрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ рдЬрдм рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рд╕реЛрдЪ рдХрд╛ рд╕рд╣реА рдореЙрдбрд▓ рд░рдЦрдиреЗ рдФрд░ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рддрд░реАрдХреЗ, рдХрдо рдХреЙрд▓
рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдФрд░ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рд╡рд░рдг рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
public static async Task SimpleBodyAsync() { Console.WriteLine("Hello, Async World!"); }
рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ рдбрд┐рдХрдореНрдкрд╛рдЗрд▓рд░ (IL) рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реЗрдЧрд╛, рдЪрд┐рддреНрд░ 1 рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд╛ рдЙрддреНрдкрд╛рджрдиред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдХ-рд▓рд╛рдЗрдирд░ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдкрд╣рд▓рд╛ рдПрдХ рд╕реНрдЯрдм рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╣реА рдирд╛рдо, рдПрдХ рд╣реА рд╕реНрдХреЛрдк рд╣реИ, рдпрд╣ рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдирдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ MoveNext рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЛрдб рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдкрд░рд┐рдгрд╛рдо рдФрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ; рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрдХрдбрд╝рдирд╛ рддрд╛рдХрд┐ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣ рд╕рдХреЗ, рдЖрджрд┐ред
рдЪрд┐рддреНрд░рд╛ 1 рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ
[DebuggerStepThrough] public static Task SimpleBodyAsync() { <SimpleBodyAsync>d__0 d__ = new <SimpleBodyAsync>d__0(); d__.<>t__builder = AsyncTaskMethodBuilder.Create(); d__.MoveNext(); return d__.<>t__builder.Task; } [CompilerGenerated] [StructLayout(LayoutKind.Sequential)] private struct <SimpleBodyAsync>d__0 : <>t__IStateMachine { private int <>1__state; public AsyncTaskMethodBuilder <>t__builder; public Action <>t__MoveNextDelegate; public void MoveNext() { try { if (this.<>1__state == -1) return; Console.WriteLine("Hello, Async World!"); } catch (Exception e) { this.<>1__state = -1; this.<>t__builder.SetException(e); return; } this.<>1__state = -1; this.<>t__builder.SetResult(); } ... }
рдЬрдм рдЖрдк рдЖрд╢реНрдЪрд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рд▓рд╛рдЧрдд рдХрд┐рддрдиреА рд╣реИ, рддреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВред рдореВрд▓рд╛рдзрд╛рд░ рдореЗрдВ рдЗрд╕ JIT рд╡рд┐рдзрд┐ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдпрд╛рд╕ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП MoveNext рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдорд┐рд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА (рдмрд╢рд░реНрддреЗ рдХрд┐ рдиреНрдпреВрдирддрд░ рд╕рд╛рдордЧреНрд░реА)ред рд╣рдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SetResult) рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд╕рд╛рде рд╣реА рд░рд╛рдЬреНрдп рдорд╢реАрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрдИ рд▓реЗрдЦрди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдХреА рд▓рд╛рдЧрддреЛрдВ рдХреЗ рд╕рд╛рде рдЗрди рд╕рднреА рд▓рд╛рдЧрддреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд╛рдЗрдЯрд▓рд╛рдЗрди, рдЬреЛ рдкреНрд░рдмрд▓ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ (рдЙрдирдореЗрдВ рд▓реЙрдХрд┐рдВрдЧ, рдЖрдИ / рдУ, рдЖрджрд┐ рдХреА рд▓рд╛рдЧрдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрдиреБрдХреВрд▓рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ (рд╕рдВрд░рдЪрдирд╛) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк рдореЗрдВ рдмреЙрдХреНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдЗрд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рдкреИрдЯрд░реНрди рдХреЛ рдвреЗрд░ рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
рдЬрдм Async рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдбреЗрд╡рд▓рдкрд░реНрд╕, рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬреЛрдЦрд┐рдо рднрд░рд╛ рдФрд░ рдЕрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВ, рддреЛ рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЙрди рддрд░реАрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдорд╣реАрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рдмрдирд╛рддреЗ рд╕рдордп, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд▓рд╛рдЧрдд рд▓рдЧрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдЖрдорддреМрд░ рдкрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддрд╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рдХрд┐рд░рд╛рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдЧрд╛рдбрд╝реА рднрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ - рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЧрд╛рдбрд╝реА рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЦрд░реНрдЪ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЪреЗрдХрдЖрдЙрдЯ рдореЗрдВ рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдирд╛ рдмрдЯреБрдЖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреНрдп рдкреИрд╕рд╛ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдореЗрдореЛрд░реА рдХрд╛ рдЖрд╡рдВрдЯрди рдЖрд╕рд╛рди рд╣реИ, рддреЛ рдмрд╛рдж рдореЗрдВ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╡реЗрджрди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рдФрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд┐рддрдиреЗ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрддрдиреА рд╣реА рдмрд╛рд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЗрд╕ рдкрд╣рд▓реВ рдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ: рдЕрдзрд┐рдХ рдХрдЪрд░рд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдорд╛рдЗрдХреНрд░реЛрдЯрд┐рд╕реНрдЯ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЧрддреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рди рдХрд░реЗрдВред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ (рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЬреЛ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ), рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЯрд╛рдЗрдк рдЯрд╛рд╕реНрдХ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдХреНрд╕рд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдирд┐рд▓рдВрдмрди рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд░рдирдЯрд╛рдЗрдо рдХреИрд╢ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рднрд░реЗ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирдП рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЕрдиреБрдордд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдПрдХ рдЧреИрд░-рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ (рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ) рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрд╛рд╕реНрдХ, рдЯрд╛рд╕реНрдХ рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИ, рдпрд╛ рдЬрдм рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЯрд╛рд╕реНрдХ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ TResult рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЗрдореЛрд░реАрд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред MemoryStream рдХреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ .NET 4.5 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдирдП рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдореЗрдореЛрд░реА-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ReadAsync, WriteAsync рдФрд░ FlushAsyncред рдЪреВрдВрдХрд┐ рд░реАрдб рдСрдкрд░реЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рдмрдлрд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрдЧрд╛ рдпрджрд┐ рд░реАрдбрдПрд╕реНрдкреБрдиреНрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
public override async Task<int> ReadAsync(byte [] buffer, int offset, int count, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); return this.Read(buffer, offset, count); }
рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рд░реАрдб рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рд░реАрдбрд╛рд╕рд┐рдВрд╕реНрдХ рдХреЗ рд╕рднреА рдХреЙрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЕрдм рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдорд╛рдирдХ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЙрдкреА рдСрдкрд░реЗрд╢рди:
byte [] buffer = new byte[0x1000]; int numRead; while((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) > 0) { await source.WriteAsync(buffer, 0, numRead); }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджрд┐рдП рдЧрдП ReadAsync рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдмрдлрд░ рд▓рдВрдмрд╛рдИ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рдорд╛рди (рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛) рднреА рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рджреБрд░реНрд▓рдн рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, ReadAsync рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреИрд╢реНрдб рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЪрд┐рддреНрд░рд╛ 2 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд╣рд┐рдд рдкрд╣рд▓реБрдУрдВ рдХреЗ рдлрд╛рдпрджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдЙрд╕реА рд░реАрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рд▓реЙрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрддреНрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд░реАрдбрд╛рд╕рд┐рдВрдХ рдХреЙрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ рдпрджрд┐ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗ рдЬрд╛рддреЗ рдереЗред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВред
рдЪрд┐рддреНрд░ 2 рдХрд╛рд░реНрдп рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрдиреБрдХреВрд▓рди
private Task<int> m_lastTask; public override Task<int> ReadAsync(byte [] buffer, int offset, int count, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { var tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); return tcs.Task; } try { int numRead = this.Read(buffer, offset, count); return m_lastTask != null && numRead == m_lastTask.Result ? m_lastTask : (m_lastTask = Task.FromResult(numRead)); } catch(Exception e) { var tcs = new TaskCompletionSource<int>(); tcs.SetException(e); return tcs.Task; } }
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (.NET 4.5 рдХреЗ рд▓рд┐рдП рдирдИ System.Net.Http.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░):
private static ConcurrentDictionary<string,string> s_urlToContents; public static async Task<string> GetContentsAsync(string url) { string contents; if (!s_urlToContents.TryGetValue(url, out contents)) { var response = await new HttpClient().GetAsync(url); contents = response.EnsureSuccessStatusCode().Content.ReadAsString(); s_urlToContents.TryAdd(url, contents); } return contents; }
рдпрд╣ рдПрдХ рдЕрдЧреНрд░рднрд╛рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдФрд░ GetContentsAsync рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдвреВрдВрдврддреЗ рд╣реИрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рд▓рд╛рдЧрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдпрджрд┐ рдЖрдк рдмрд╕ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреЗ рд╣реИрдВред
рдЗрди рд▓рд╛рдЧрддреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрджрд┐ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ), рддреЛ рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЪрд┐рддреНрд░ 3 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдФрд░ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ред рд╢рдмреНрджрдХреЛрд╢ рд╕рдВрдЧреНрд░рд╣ рдЕрдм рдмрдирд╛рдИ рдЧрдИ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрд╕ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореМрдЬреВрджрд╛ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣ рддрдХ рдкрд╣реБрдВрдЪрдХрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрджрд░, рдЖрдк рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ ContinueWith рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрджрд┐ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд░рд╣рд╛ред рдмреЗрд╢рдХ, рдпрд╣ рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдЖрдк рдЗрд╕реЗ рддрдм рддрдХ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдпрд╣ рди рджрд┐рдЦрд╛ рджреЗ рдХрд┐ рдпреЗ рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рдЗрд╕рдХреЗ рд╕реБрдзрд╛рд░ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡реЗрджрди рдХреА рд╡рд┐рдзрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЦреЗрд▓ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдЪрд┐рддреНрд░рд╛ 3 рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ
private static ConcurrentDictionary<string,Task<string>> s_urlToContents; public static Task<string> GetContentsAsync(string url) { Task<string> contents; if (!s_urlToContents.TryGetValue(url, out contents)) { contents = GetContentsInternalAsync(url); contents.ContinueWith(delegate { s_urlToContents.TryAdd(url, contents); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuatOptions.ExecuteSynchronously, TaskScheduler.Default); } return contents; } private static async Task<string> GetContentsInternalAsync(string url) { var response = await new HttpClient().GetAsync(url); return response.EnsureSuccessStatusCode().Content.ReadAsString(); }
рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рд╕реЗ рдРрд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред C # рдФрд░ Visual Basic рджреЛрдиреЛрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди (рд╢реВрдиреНрдп) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╢реВрдиреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдореМрдЬреВрджрд╛ рдИрд╡реЗрдВрдЯ-рдЪрд╛рд▓рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг, рдЬреИрд╕реЗ ASP.NET рдФрд░ Windows рдкреНрд░рд╕реНрддреБрддрд┐ рдлрд╛рдЙрдВрдбреЗрд╢рди (WPF) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдПрд╕реНрдХрд┐рдВрдЯ рдФрд░ рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрди рддрд░реАрдХреЛрдВ рд╕реЗ рдмрдЯрди рд╣реИрдВрдбрд▓рд░реНрд╕, рдкреЗрдЬ рд▓реЛрдб рдЗрд╡реЗрдВрдЯ рдЖрджрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ: рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдкрд╡рд╛рдж рдХрд┐рд╕реА рднреА рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдкреЙрдк рдЕрдк рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЙрд╕ рд╕рдордп рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред
рд╕рдВрджрд░реНрдн рдордд рднреВрд▓рдирд╛
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рд╣реИрдВ: LogicalCallContext, SynchronizationContext, HostExecutionContext, SecurityContext, ExecutionContext рдФрд░ рдЕрдиреНрдп (рдЙрдирдХреА рд╡рд┐рд╢рд╛рд▓ рд░рд╛рд╢рд┐ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреА рд╣реИ рдХрд┐ рдирдП рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рддреНрддреАрдп рд░реВрдк рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдереЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЬрд╝рд░реВрд░ рдкрддрд╛ рд╣реИ)ред рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕рдВрджрд░реНрдн рди рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рдПрдХ "рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн" рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрдд рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдордВрдЧрд▓рд╛рдЪрд░рдгред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, WPF рдореЗрдВ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (UI) рдереНрд░реЗрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DispatcherSynchronizationContext рд╣реИ: рдЗрд╕ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рднреЗрдЬрдиреЗ рд╕реЗ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдбрд┐рд╕реНрдкреИрдЪрд░ рджреНрд╡рд╛рд░рд╛ рдЙрд╕рдХреЗ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░рдмрджреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред ASP.NET рдПрдХ AspNetSynchronizationContext рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ASP.NET рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдФрд░ рд╕рд╣реА HttpContext рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдЦреИрд░, рдЖрджрд┐ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ SynchronizationContext рдХреЗ рд▓рдЧрднрдЧ 10 рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ, рдХреБрдЫ рдЦреБрд▓реЗ, рдХреБрдЫ рдЖрдВрддрд░рд┐рдХред
рдЬрдм .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TaskAwaiter) рдЙрд╕ рд╕рдордп рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдкреНрд░рддреАрдХреНрд╖рд╛ (рдкреНрд░рддреАрдХреНрд╖рд╛) рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдпрджрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдЗрд╕ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпреВрдЖрдИ рдирд┐рдпрдВрддреНрд░рдг рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдПрдХ рдореВрд▓реНрдп рдкрд░ рдЖрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реЛрддреА рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреВрдЖрдИ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЖрд╡рд╢реНрдпрдХ ASP.NET рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк HttpContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдирддреАрдЬрддрди, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд▓рд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЙрд╕ рдХреЛрдб рдкрд░ рдПрдХ рдФрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рджреВрд╕рд░реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ:
byte [] buffer = new byte[0x1000]; int numRead; while((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) > 0) { await source.WriteAsync(buffer, 0, numRead); }
рдпрджрд┐ рдпрд╣ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ UI рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ UI рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░реЗрдЧреАред рд╕реНрд░реЛрдд рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рдзрд╛рд░рд╛рдПрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рддреА рд╣реИрдВ рдФрд░ рд▓рд┐рдЦрддреА рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рдЙрдирдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди), рдЗрд╕рдХрд╛ рдорддрд▓рдм рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рд░рд╛ рд╕реЗ рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рддрдХ рд▓рдЧрднрдЧ 500 рд╕реНрд╡рд┐рдЪ рд╣реЛрддрд╛ рд╣реИред рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░рд╡рд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрд╛рд░реАрдСрдирдХреЗрдкреНтАНрдЯрд░реНрдб рдХреЙрдиреНрдЯреЗрдХреНтАНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ рдЬреЛ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рд╣реА (рдбрд┐рдлрд╝реЙрд▓реНрдЯ), рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЧрд▓рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЙрд╕ рдереНрд░реЗрдб рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХреЙрдкреА рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛:
byte [] buffer = new byte[0x1000]; int numRead; while((numRead = await source.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false)) > 0) { await source.WriteAsync(buffer, 0, numRead).ConfigureAwait(false); }
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдРрд╕рд╛ рддреНрд╡рд░рдг рд╣рдореЗрд╢рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░рдПрд╡рд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рджреБрд░реНрд▓рдн рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрдиреНрдлрд┐рдЧрд░рдПрд╡рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ CopyStreamToStreamAsync рд╡рд┐рдзрд┐, рдХреЙрдиреНрдлрд┐рдЧрд░рдПрд╡рд┐рдЯ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, WPF рдореЗрдВ UI рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
private void button1_Click(object sender, EventArgs args) { Stream src = тАж, dst = тАж; Task t = CopyStreamToStreamAsync(src, dst); t.Wait(); // deadlock! }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдЯрди1_ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдЯрд╛рд╕реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рдЧрд▓рддреА рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рддрдХ рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧреАред CopyStreamToStreamAsync рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реНрдЯреНрд░реАрдо рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ, рдФрд░ рддрдм рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░ рдкреВрд░реЗ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдпреЗ рдкреНрд░реЗрд╖рдг, рдмрджрд▓реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреВрдЖрдИ рдереНрд░реЗрдб рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИред рдпрд╣ рдПрдХ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдЬреЛ рдЧрддрд┐рд░реЛрдз рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ CopyStreamToStreamAsync рдХреЛ ConfigureAwait (рдЭреВрдард╛) рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЕрд╡рд░реЛрдзрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
ExecutionContext ExecutionContext .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕реЗ рдЕрдирдЬрд╛рди рд╣реИрдВред ExecutionContext тАУ , SecurityContext LogicalCallContext, , . , ThreadPool.QueueUserWorkItem, Task.Run, Delegate.BeginInvoke, Stream.BeginRead, WebClient.DownloadStringAsync Framework, ExecutionContext ExecutionContext.Run ( ). , , ThreadPool.QueueUserWorkItem, Windows (identity), WaitCallback. , Task.Run LogicalCallContext, LogicalCallContext Action. ExecutionContext .
Framework , ExecutionContext, , . Windows LogicalCallContext . (WindowsIdentity.Impersonate CallContext.LogicalSetData) .
. C# Visual Basic , . await. , , - . C# Visual Basic (┬л┬╗) , await (boxed) , .
. , . , , , .
C# Visual Basic , . ,
public static async Task FooAsync() { var dto = DateTimeOffset.Now; var dt = dto.DateTime; await Task.Yield(); Console.WriteLine(dt); }
dto await, . , , - dto:
Figure 4
[StructLayout(LayoutKind.Sequential), CompilerGenerated] private struct <FooAsync>d__0 : <>t__IStateMachine { private int <>1__state; public AsyncTaskMethodBuilder <>t__builder; public Action <>t__MoveNextDelegate; public DateTimeOffset <dto>5__1; public DateTime <dt>5__2; private object <>t__stack; private object <>t__awaiter; public void MoveNext(); [DebuggerHidden] public void <>t__SetMoveNextDelegate(Action param0); }
, . , , , , . , :
public static async Task FooAsync() { var dt = DateTimeOffset.Now.DateTime; await Task.Yield(); Console.WriteLine(dt); }
, .NET (GC) , , , : 0, , , (.NET GC 0, 1 2). , GC . , , , , , , . 0, , , . , , , .
( , ). JIT , , , , . , , . , , , , . , , . , C# Visual Basic , , .
C# Visual Basic , awaits: . await , Task , , . , , :
public static async Task<int> SumAsync(Task<int> a, Task<int> b, Task<int> c) { return Sum(await a, await b, await c); } private static int Sum(int a, int b, int c) { return a + b + c; }
C# тАЬawait bтАЭ Sum. await, Sum, - async , ┬л┬╗ await. , await . , , CLR, , , . , <>t__stack. , , Tuple<int, int> <>__stack. , , , . , SumAsync :
public static async Task<int> SumAsync(Task<int> a, Task<int> b, Task<int> c) { int ra = await a; int rb = await b; int rc = await c; return Sum(ra, rb, rc); }
, ra, rb rc, . , : . , , , . , , , , .
, , . Sum , await , . , await , . await , Task.WhenAll:
public static async Task<int> SumAsync(Task<int> a, Task<int> b, Task<int> c) { int [] results = await Task.WhenAll(a, b, c); return Sum(results[0], results[1], results[2]); }
Task.WhenAll Task<TResult[]>, , , , . . , WhenAll, Task Task. , , , , , WhenAll , . WhenAll, , , params, . , , . Figure 5
Figure 5
public static Task<int> SumAsync(Task<int> a, Task<int> b, Task<int> c) { return (a.Status == TaskStatus.RanToCompletion && b.Status == TaskStatus.RanToCompletion && c.Status == TaskStatus.RanToCompletion) ? Task.FromResult(Sum(a.Result, b.Result, c.Result)) : SumAsyncInternal(a, b, c); } private static async Task<int> SumAsyncInternal(Task<int> a, Task<int> b, Task<int> c) { await Task.WhenAll((Task)a, b, c).ConfigureAwait(false); return Sum(a.Result, b.Result, c.Result); }
, . , . , . , , : , , / , . .NET Framework , . , .NET Framework, . , , Framework, , , .