рд╣рдо рдореЗрдВ рд╕реЗ рдХреМрди рдорд╛рд╡реЗ рдирд╣реАрдВ рдЦрд╛рддрд╛? рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦреБрдж рдХрд░рддрд╛ рд╣реВрдВред рд╕рдВрд╕рд╛рд░ рдХреЗ рдЗрд╕ рдЪрдХреНрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЙрди рд╕рдмрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рдореЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрднреА-рдХрднреА рдкрдХрдбрд╝рдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдкрд╛рда рд╕реНрдЯреАрдлрди рдХреНрд▓реЗрд░реА рдХреЗ рдмреНрд▓реЙрдЧ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ, рдПрдХ рдРрд╕рд╛ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдмрд╣реБрдЖрдпрд╛рдореА рдФрд░ рдЕрдиреНрдп рдбрд░рд╛рд╡рдиреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИред рд╡рд╣ рд╕реА # рдХреБрдХрдмреБрдХ рдореЗрдВ рдХрд┐рддрд╛рдм рдХреЙрдирдПрд░реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓реЗрдЦрдХ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрдЯрд░реНрди рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВред
рдХреНрд▓рд╛рд╕рд┐рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрддрд┐рд░реЛрдз
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрддрд┐рд░реЛрдз рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдзрд╛рдЧрд╛ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ async рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░ рджреЗрдЧреА рдЬрдм рддрдХ рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реНрд░реЛрдд рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдПрдХ рд╡рд┐рд╖рдп рд╣реИ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред рдЕрдм рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдиреБрд░реЛрдз рдпрд╛ HTTP рдЕрдиреБрд░реЛрдзред рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдордХрд╛рд▓рд┐рдХ рд╢реБрд░реБрдЖрдд рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧрд┐рд░рддрд╛ рд╣реБрдЖ рдзрд╛рдЧрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдореЗрдВ, рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ "рдкрд╣рд▓реЗ" рдФрд░ "рдмрд╛рдж" рдкрд░ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ .NET рдореЗрдВ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? SynchronizationContext
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрди рдереНрд░реЗрдбреНрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╕рдВрджрд░реНрднреЛрдВ ( WindowsFormsSynchronizationContext
рдФрд░ AspNetSynchronizationContext
) рд╕реЗ AspNetSynchronizationContext
, рд▓реЗрдХрд┐рди рдПрд▓реЗрдХреНрд╕ рдбреЗрд╡рд┐рд╕ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ .NET рдореЗрдВ рдЙрдирдХреЗ рд▓рдЧрднрдЧ рдПрдХ рджрд░реНрдЬрди рд╣реИрдВред SynchronizationContext
рдмрд╛рд░реЗ рдореЗрдВ SynchronizationContext
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдБ , рдпрд╣рд╛рдБ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ , рдФрд░ рдпрд╣рд╛рдБ рд▓реЗрдЦрдХ рдиреЗ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдмрд╣реБрдд рд╕рдореНрдорд╛рди рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕реЗ рд╣реА рдХреЛрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЗ рд╕реНрд░реЛрдд рдкрд░ рдЖрддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ.рдХреНрд░рдВрдЯ рдХреА рдереНрд░реЗрдб-рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдерд╛, рдлрд┐рд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рднреА рд╕реВрддреНрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╕реЗ рдореБрдЦреНрдп рд▓рд╛рдн рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реНрд░реЛрдд рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ, рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдзрд╛рдЧрд╛ рд╣реИ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рд╡рд╣ рдХрд╣рддрд╛ рд╣реИ, рд╣рдо рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред рд╡рд╣ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рдзрд╛рдЧреЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рд╣рдо рдЙрд╕реА рдзрд╛рдЧреЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗ - рд╣рдо рдкреВрд▓ рд╕реЗ рдкрд╣рд▓рд╛ рдзрд╛рдЧрд╛ рд▓реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХреЛрдб рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдХрд┐рд╕реА рднреА рдореБрдХреНрдд рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЖрдкрдХреЛ ConfigureAwait(false)
рдордВрддреНрд░ ConfigureAwait(false)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред continueOnCapturedContext
рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЧрд▓рдд рдорд╛рди ONCapturedContext рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреВрд▓ рд╕реЗ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдХреЛрдИ рднреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдерд╛ ( SynchronizationContext.Current == null
), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рдереНрд░реЗрдб рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдкреВрд▓ рд╕реЗ рдкрд╣рд▓рд╛ рдереНрд░реЗрдб рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ ConfigureAwait(false)
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред
рддреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрддрд┐рд░реЛрдз рдХреНрдпрд╛ рд╣реИ?
WPF рдФрд░ WinForms рдореЗрдВ рдЧрддрд┐рд░реЛрдз
WPF рдФрд░ WinForms рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмрд╣реБрдд рд╣реА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реИред WPF рдФрд░ WinForms рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдереНрд░реЗрдб рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдбред SynchronizationContext
рдкреНрд░рддрд┐ рдПрдХ UI рдереНрд░реЗрдб рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдереНрд░реЗрдб рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЗрд╕рдореЗрдВ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдСрдкрд░реЗрд╢рди рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ:
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { StartWork().Wait(); } private async Task StartWork() { await Task.Delay(100); var s = "Just to illustrate the instruction following await"; }
рдЬрдм рдЖрдк
StartWork().Wait()
рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ
StartWork().Wait()
:
- рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб (рдФрд░ рдпрд╣ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдереНрд░реЗрдб рд╣реИ)
StartWork
рд╡рд┐рдзрд┐ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ рдФрд░ StartWork
рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред await Task.Delay(100)
рдирд┐рд░реНрджреЗрд╢ред - UI рдереНрд░реЗрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ
Task.Delay(100)
рд╢реБрд░реВ рдХрд░ Task.Delay(100)
рдСрдкрд░реЗрд╢рди, рдФрд░ рдпрд╣ Button_Click
рд╡рд┐рдзрд┐ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг Button_Click
, рдФрд░ рд╡рд╣рд╛рдВ Task
рд╡рд░реНрдЧ рдХреА Wait()
рд╡рд┐рдзрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧреАред рдЬрдм Wait()
рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпреВрдЖрдИ рдзрд╛рдЧрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпреВрдЖрдИ рдереНрд░реЗрдб рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрди рдЙрдард╛рдПрдЧрд╛ рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛрдЧрд╛ред - рдЬреИрд╕реЗ рд╣реА
Task.Delay(100)
рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, UI рдереНрд░реЗрдб рдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ StartWork()
рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдЙрд╕реА рдереНрд░реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╛рд░рдВрдн рд╣реБрдЖ рдерд╛ред рд▓реЗрдХрд┐рди UI рдереНрд░реЗрдб рдЕрдм рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред StartWork()
: StartWork()
рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ Button_Click
рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╕ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдореМрдХрд╛ рджрд┐рдП рдмрд┐рдирд╛ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХреЙрд▓ рдХреЛ
Task.Delay(100)
рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Task.Delay(100)
рдХреЛ
Task.Delay(100).ConfigureAwait(false)
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { StartWork().Wait(); } private async Task StartWork() { await Task.Delay(100).ConfigureAwait(false); var s = "Just to illustrate the instruction following await"; }
рдпрд╣ рдХреЛрдб рдбреЗрдбрд▓реЙрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдмреНрд▓реЙрдХ рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЗ рдмрдЬрд╛рдп рдкреВрд▓ рд╕реЗ рдПрдХ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ StartWork()
рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдЯреАрдлрди рдХреНрд▓реЗрд░реА рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рд╕рднреА "рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ" рдореЗрдВ ConfigureAwait(false)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЧрддрд┐рд░реЛрдз рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдиреНрдлрд┐рдЧрд░рдПрд╡рд┐рдЯ ConfigureAwait(false)
рдХрд╛ рдЙрдкрдпреЛрдЧ ConfigureAwait(false)
рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡рд╣ Wait()
, Result
, GetAwaiter().GetResult()
рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рддрдерд╛рдХрдерд┐рдд Async рд╕рднреА рддрд░рд╣ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ GetAwaiter().GetResult()
рдХрд░реЗрдВред
ASP.NET рдореЗрдВ рдЧрддрд┐рд░реЛрдз
ASP.NET рдХрд╛ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреБрдЫ рдЕрд▓рдЧ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЛ рдЙрд╕реА рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
public class HomeController : Controller { public ActionResult Deadlock() { StartWork().Wait(); return View(); } private async Task StartWork() { await Task.Delay(100); var s = "Just to illustrate the code following await"; } }
StartWork().Wait()
рдХреЙрд▓ рдХреЗ рд╕рдордп рд╕реЗ рдпрд╣ рдХреЛрдб рдПрдХ рдЧрддрд┐рд░реЛрдз рдХрд╛ рдХрд╛рд░рдг рднреА рдмрдиреЗрдЧрд╛ StartWork().Wait()
рдХреЗрд╡рд▓ рдЕрдиреБрдордд рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ StartWork()
рдСрдкрд░реЗрд╢рди рдХреЗ StartWork()
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рдХрднреА рднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡реНрдпрд╕реНрдд рд╣реИред рдЙрдореНрдореАрджред
рдпрд╣ рд╕рдм рдПрдХ рд╣реА ConfigureAwait(false)
рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
ASP.NET рдХреЛрд░ рдореЗрдВ рдЧрддрд┐рд░реЛрдз (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ)
рдЕрдм рдХреЛрдб рдХреЛ ASP.NET рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ ASP.NET рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдИ рдЧрддрд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ASP.NET Core рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ ред рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдФрд░ рдЕрдм рдЖрдк рдЕрд╡рд░реБрджреНрдз рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдбрд▓реЙрдХ рд╕реЗ рдбрд░ рдирд╣реАрдВ рд╕рдХрддреЗ? рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдзрд╛рдЧрд╛ рд╕реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдзрд╛рдЧрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ ред рд╣рд╛рдВ, рдХрднреА-рдХрднреА Wait()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ Wait()
рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЧрдВрднреАрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
Task.Run () рдХрд╛ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ
Task.Run()
рд╡рд┐рдзрд┐ рдПрдХ рдирдП рдзрд╛рдЧреЗ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдереАред рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ TAP рдкреИрдЯрд░реНрди рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╡рд┐рдзрд┐ рд╣реИ, рдпрд╣ Task
рдпрд╛ Task<T>
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ async / рдЗрдВрддрдЬрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ Task.Run()
рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдмрд╣реБрдд рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ eutite рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддреАрдд рд╣реЛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Task.Run()
рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
private static async Task ExecuteOperation() { Console.WriteLine($"Before: {Thread.CurrentThread.ManagedThreadId}"); await Task.Run(() => { Console.WriteLine($"Inside before sleep: {Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(1000); Console.WriteLine($"Inside after sleep: {Thread.CurrentThread.ManagedThreadId}"); }); Console.WriteLine($"After: {Thread.CurrentThread.ManagedThreadId}"); }
рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:
Before: 1 Inside before sleep: 3 Inside after sleep: 3 After: 3
рдпрд╣рд╛рдБ Thread.Sleep(1000)
рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рддрд╛рдХрд┐ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ Task.Run()
рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд╣рдордиреЗ рдЗрд╕реЗ Task.Run()
рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ред
рдЬреИрд╕реЗ рд╣реА рдХреЛрдб Task.Run()
рд╡рд┐рдзрд┐ рдкрд░ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдХреЛрдб рд╣рдордиреЗ Task.Run()
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╕рднреНрдп рдзрд╛рдЧрд╛ рд╣реИ, рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдирдпрд╛ рдереНрд░реЗрдб рд╕рдВрдЪрд╛рд░рд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░рд╣рд╛: рд╣рдо, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ Task.Run()
рдХреЛ ExecuteOperation()
рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордпред Task.Run()
рдФрд░ Task.Run()
рд╡рд╛рдкрд╕ ExecuteOperation()
ред рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ Inside after sleep: 3
рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ Inside after sleep: 3
рдФрд░ After: 3
рд╣рдо рдзрд╛рд░рд╛ рдХреЗ рдПрдХ рд╣реА рдИрдж рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдВрджрд░реНрдн рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред ASP.NET рдмрд╕ рд╣рдорд╕реЗ рдЕрдзрд┐рдХ рдЪрд╛рд▓рд╛рдХ рд╣реИ рдФрд░ Task.Run()
рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рд╕реЗ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред Task.Run()
рд╕реЗ рдмрд╛рд╣рд░реА рдХреЛрдбред рдпрд╣рд╛рдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ Task.Run()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреНрд▓реИрд░реА рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреА рд╣реИ , рдЕрд░реНрдерд╛рдд, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, Thread.Sleep(1000)
рдХреЛ Task.Delay(1000)
рд╕рд╛рде Task.Delay(1000)
, рд▓реЗрдХрд┐рди рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЬрдм рд╣рдо рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ рдЬреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдФрд░ рдЕрдВрдд рддрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдХрд╛рд░рдг рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ async рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЯрд╛рд╕реНрдХ рдореЗрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП Task.FromResult()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдб рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдХрдо рд╕реЗ рдХрдо рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкрд░ рдмрдЪрдд рдХрд░реЗрдВрдЧреЗред
рддреЛ рдлрд┐рд░ Task.Run () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ? рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рд╕реАрдкреАрдпреВ-рдмрд╛рдЙрдВрдб рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЛ рдпреВрдЖрдИ рдХреА рдЬрд╡рд╛рдмрджреЗрд╣реА рдмрдирд╛рдП рд░рдЦрдиреЗ рдпрд╛ рдЧрдгрдирд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реАрдкреАрдпреВ-рдмрд╛рдЙрдВрдб рдСрдкрд░реЗрд╢рди рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╢реИрд▓реА рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдерд╛ рдЬрд┐рд╕реЗ Task.Run()
рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Async рд╢реВрдиреНрдп рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрджрд┐ рд╡реЗ рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рднреНрд░рдо рдХреНрдпреЛрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
- рдХреЛрд╢рд┐рд╢-рдХреИрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
Task.WhenAll()
, Task.WhenAny()
рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдЗрди рд╕рднреА рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ Task
рдпрд╛ Task<T>
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд╕рд┐рдВрдХреНрд╕ рддрд░реАрдХреЛрдВ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рдХреЛ Task
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрдХрдбрд╝рд╛ рдФрд░ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдкрдиреЗ рдПрдордПрд╕рдбреАрдПрди рд▓реЗрдЦ рдореЗрдВ, рдХреНрд▓реИрд░реА рд▓рд┐рдЦрддреА рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕-рд╢реВрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЕрдирд╣реЗрд▓реНрджреА рдЕрдкрд╡рд╛рдж рд╣реИ рдЬрд┐рд╕рдХреА рд╡рдЬрд╣ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд╕рдордп рд░рд╣рддреЗ, рд╢рд╛рдпрдж, рдХрдВрд╕реЛрд▓ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЖрдк AppDomain.UnhandledException
рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдХрд░ рдРрд╕реЗ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░реИрд╢ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд╡рд▓ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХреЛрд╢рд┐рд╢-рдХреИрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк ASP.NET рдХреЛрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрд┐рд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ:
public IActionResult ThrowInAsyncVoid() { ThrowAsynchronously(); return View(); } private async void ThrowAsynchronously() { throw new Exception("Obviously, something happened"); }
рд▓реЗрдХрд┐рди рдпрд╣ ThrowAsynchronously
рддрд░реАрдХреЗ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ Task
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд░рд╣рд╛ рд╣реИ (рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреАрд╡рд░реНрдб рдХреЛ рднреА рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛) рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдорд╛рдирдХ ASP.NET рдХреЛрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд╡рдЬреВрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд░реА рд░рд╣реЗрдЧреАред
Async-void рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ - рд╡реЗ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдкрдВрдХреНрддрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
рдкрд┐рдЫрд▓реЗ рдПрдВрдЯреАрдкрд╛рд░реНрдЯрд░реНрди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ async / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдФрд░ async рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВ, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рдеред
рдЗрд╕ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп:
public async Task MyMethodAsync() { await Task.Delay(1000); }
рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ (рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП:
public Task MyMethodAsync() { return Task.Delay(1000); }
рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдЯрд╛рд╕реНрдХ рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рддрд░реАрдХреЛрдВ рдкрд░ред рдмрджрд▓реЗ рдореЗрдВ, async рдХреАрд╡рд░реНрдб рдмрд╕ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдкрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рд▓реМрдЯреЗ рдорд╛рдиреЛрдВ рдХреЛ Task
рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЯрд╛рд╕реНрдХ-рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ)ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо Task
, рдЬреЛ Task
рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ Task.Delay(1000)
Completed
рд╣реЛ рдЬрд╛рдПрдЧрд╛ред ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдорддреБрд▓реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ "рд╕реБрдкрд░ рдХрд┐рдЯ" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдПрд▓реЗрдХреНрд╕ рдбреЗрд╡рд┐рд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рджрд╕ рдЧреБрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред
рдпреБрдкреАрдбреА:рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдареАрдХ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ, рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреЗ рд╕рдордп, рдЯрд╛рд╕реНрдХ рдХреЛ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рд╕реНрдЯреИрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред рдЗрд╕рд▓рд┐рдП,
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪреВрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ ред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде
рдХреНрд▓реЗрд░реА рдХреА рдкреЛрд╕реНрдЯ ред