ConfigureAwait, рдХрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдореЗрд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдПрдХ рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ:


[1] var x = FooWithResultAsync(/*...*/).Result; // [2] FooAsync(/*...*/).Wait(); // [3] FooAsync(/*...*/).GetAwaiter().GetResult(); // [4] FooAsync(/*...*/) .ConfigureAwait(false) .GetAwaiter() .GetResult(); // [5] await FooAsync(/*...*/).ConfigureAwait(false) //  [6] await FooAsync(/*...*/) 

рдРрд╕реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡реЗ рд╕рднреА рддреАрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ:


  • рдкрд╣рд▓рд╛ рд╕рдореВрд╣ рд╡реЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ Result/Wait/GetResult рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдЗрд╕ рд╕рдореВрд╣ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг (1-3) рдФрд░ рдХрднреА-рдХрднреА (6) рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ;
  • рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрдиреА рдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдореВрд╣ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдПрдХ рддрд░рдл, (1-3 рдФрд░ 6) рдЬреИрд╕реА рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреВрд╕рд░реЗ рдкрд░, рджреБрд░реБрдкрдпреЛрдЧ рдХреЛрдб рдЬреИрд╕реЗ (4-5);
  • рддреАрд╕рд░рд╛ рд╕рдореВрд╣, рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛, рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб (1-6) рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реВрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЬреЛрдЦрд┐рдо рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реИ, рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ ред



рдЬреЛрдЦрд┐рдо рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░рдг


рдЙрджрд╛рд╣рд░рдг (1-6) рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред рдкрд╣рд▓рд╛ рд╕рдореВрд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдореВрд╣ рдореЗрдВ (1-4) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдПрдХ рдзрд╛рдЧреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХреНрдпреЛрдВ? рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдзрд╛рдЧреЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рддрд╛рд▓рд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкреВрд▓ рд╕реЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЪрдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡реЛрддреНрддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдХреНрд╖рдо рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдЧрд╛ред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдзрд╛рдЧреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд▓ рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ (1-4) рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдХрд┐рддрдиреА рд╕рдВрднрд╛рд╡рд┐рдд рд╣реИред


рд▓реЗрдХрд┐рди рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдЬрдм рд╣рдо рдПрдХ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирдХ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдХрдИ рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧрддрд┐рд░реЛрдз рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг (1-3) рд╕реЗ рдХреЛрдб, рдЕрдЧрд░ рдЗрд╕реЗ WinForms UI рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреА рд╣реИред рдореИрдВ "рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ" рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрдм рдпрд╣ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред ConfigureAwait(false) рдЬреЛрдбрд╝рдирд╛, (4) рдХреЗ рд░реВрдк рдореЗрдВ, рдЧрддрд┐рд░реЛрдз рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреА 100% рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдмрд╛рдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


 [7] //   /  . async Task FooAsync() { // Delay   .     . await Task.Delay(5000); //       RestPartOfMethodCode(); } //  ""  ,   ,  WinForms . private void button1_Click(object sender, EventArgs e) { FooAsync() .ConfigureAwait(false) .GetAwaiter() .GetResult(); button1.Text = "new text"; } 

рд▓реЗрдЦ "рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ - рдпрд╣ рд╕рднреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ" рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдЧрддрд┐рд░реЛрдз рдХреЗ рдХрд╛рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓ рдХреЛ async рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ MS рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдХреЛрдбред рдПрдХ Async рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдЙрддреНрдкрдиреНрди StateMachine рд▓реЗрдЦ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛ (7), рдСрдЯреЛрдореЗрдЯрди, рдореИрдВ рдХреЗрд╡рд▓ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛:


 //  MoveNext. //... //  taskAwaiter    . taskAwaiter = Task.Delay(5000).GetAwaiter(); if(tasAwaiter.IsCompleted != true) { _awaiter = taskAwaiter; _nextState = ...; _builder.AwaitUnsafeOnCompleted<TaskAwaiter, ThisStateMachine>(ref taskAwaiter, ref this); return; } 

if рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ ( Delay ) рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдФрд░ if рд╢рд╛рдЦрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ AwaitUnsafeOnCompleted , taskAwaiter рдПрдХ рдЖрдВрддрд░рд┐рдХ ( FooAsync рд╕рд╛рдкреЗрдХреНрд╖) рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ ( Delay ) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк AwaitUnsafeOnCompleted рдХреЙрд▓ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ MS рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЬрдВрдЧрд▓ рдореЗрдВ рдбреБрдмрдХреА AwaitUnsafeOnCompleted рд╣реИрдВ, рддреЛ, рдЕрдВрдд рдореЗрдВ, рд╣рдо SynchronizationContextAwaitTaskContinuation class, рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ AwaitTaskContinuation рдкрд░ рдЖрдПрдВрдЧреЗ , рдЬрд╣рд╛рдБ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╕реНрдерд┐рдд рд╣реИред


рдЗрди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдХреЛрдб рдмрд▓реНрдХрд┐ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ "рдПрдирд╛рд▓реЙрдЧ" рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг (7) рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдЯреАрдкреАрдПрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ:


 [8] Task FooAsync() { //  methodCompleted    ,  , //    ,     " ". //    ,   methodCompleted.WaitOne()  , //   SetResult  AsyncTaskMethodBuilder, //       . var methodCompleted = new AutoResetEvent(false); SynchronizationContext current = SynchronizationContext.Current; return Task.Delay(5000).ContinueWith( t=> { if(current == null) { RestPartOfMethodCode(methodCompleted); } else { current.Post(state=>RestPartOfMethodCode(methodCompleted), null); methodCompleted.WaitOne(); } }, TaskScheduler.Current); } // // void RestPartOfMethodCode(AutoResetEvent methodCompleted) // { //      FooAsync. // methodCompleted.Set(); // } 

рдЙрджрд╛рд╣рд░рдг (8) рдореЗрдВ, рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рдЖрдВрддрд░рд┐рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн (рдХреЙрд▓ current.Post(...) ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рддрдереНрдп рдЧрддрд┐рд░реЛрдз рдХрд╛ рдХрд╛рд░рдг рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо рдПрдХ WinForms рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн UI рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ UI рдереНрд░реЗрдб рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (7) рдпрд╣ рдПрдХ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред .GetResult() , рддреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдкреВрд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬреЛ рд╣реИ рдЧрддрд┐рд░реЛрдзред


рдЙрджрд╛рд╣рд░рдг (7) рдореЗрдВ, FooAsync рдХреЛ рдХреЙрд▓ ConfigureAwait(false) рдорд╛рдзреНрдпрдо рд╕реЗ ConfigureAwait(false) рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╕реНрддреБ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ AwaitUnsafeOnCompleted рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ Delay рдХреЙрд▓ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╕реНрддреБ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ ConfigureAwait(false) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ FooAsync рд╡рд┐рдзрд┐ рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ:


 [9] async Task FooAsync() { await Task.Delay(5000).ConfigureAwait(false); //       RestPartOfMethodCode(); } private void button1_Click(object sender, EventArgs e) { FooAsync().GetAwaiter().GetResult(); button1.Text = "new text"; } 

рдКрдкрд░, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЬреЛрдЦрд┐рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА - рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЛрдб (рдЙрджрд╛рд╣рд░рдг 1-4)ред рдЕрдм рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг 5 рдФрд░ 6) - рддрд╛рд▓реЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХреЛрдбред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ ConfigureAwait(false) рд▓рд┐рдП рдХреЙрд▓ рдХрдм рдЙрдЪрд┐рдд рд╣реИ? рдЙрджрд╛рд╣рд░рдг (7) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╕реНрддреБ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛рдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ) рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдПред


рдХрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ?


рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╕рд╣реА рдЙрддреНрддрд░ "рд╕рдм рдХреБрдЫ рд╣реИред" рдЪрд▓реЛ рдПрдордПрд╕ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рддрд░рдл, Microsoft рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐, рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрднреА рднреА рдХреНрдпреЛрдВ рд╣реИред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЙрдореНрдореАрдж рдереА рдХрд┐ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЛрдб рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ , рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдЗрд╕реЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ "рдкреИрд░ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП" рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрдкрдХрд░рдг рджрд┐рдпрд╛ - рдпрд╣ рдЕрд╡рд░реБрджреНрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ .Result/.GetResult , рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ, рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛рдиреА рдПрдордПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдпрд╣ рд╕рдВрднрд╡ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ "рдЧрд▓рдд" (рдпрд╛ рдЦрддрд░рдирд╛рдХ) рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред


рд▓реЗрдХрд┐рди "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЛрдб рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рджреЛрд╖ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐, рдЕрдХреНрд╕рд░, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рдЙрдкрдХрд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдЧрд▓рддрд┐рдпреЛрдВ рдХрд╛ рд╕реАрдзрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред


рдХреНрдпрд╛ рдХрд░реЗрдВ?


рдиреАрдЪреЗ рдореИрдВ рдЕрдкрдиреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреЗрддрд╛ рд╣реВрдВред


рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП


  1. рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЛ рди рдорд┐рд▓рд╛рдПрдВред
  2. рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд▓реЙрдХ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдб рдХреЛ рдХрд┐рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
    • рдХреНрдпрд╛ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреМрди рд╕рд╛? рд╡рд╣ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ?
    • рдпрджрд┐ рдХреЛрдИ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рддреЛ: рд▓реЛрдб рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдмреНрд▓реЙрдХ рдкреВрд▓ рд╕реЗ рдзрд╛рдЧреЗ рдХреЗ "рд░рд┐рд╕рд╛рд╡" рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдЧрд╛? рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреА, рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
  3. рдпрджрд┐ рдХреЛрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд┐рдЧрд░рдПрд╡рд┐рдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдкреНрд░рд╛рдкреНрдд рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╢рд╛рдпрдж ConfigureAwait рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдпрд╛ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП


  1. рдпрджрд┐ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ "рд╕рд┐рдВрдХреНрд░реЛрдирд╕" рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдЖрдкрдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. ConfigureAwait(true / false) ред

рдпрд╣рд╛рдБ, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрдИ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдореЗрдВ, рд╕рднреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓реНрд╕ ConfigureAwait(false) рдорд╛рдзреНрдпрдо рд╕реЗ ConfigureAwait(false) рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рд╢рд╛рдпрдж, рд▓реЗрдЦрдХреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп Microsoft рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рдЧрд▓рдд рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╡реЗ (рдПрдордПрд╕), рдлрд┐рд░ рднреА, рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЛрдб рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рдЫреЛрдбрд╝ рдЧрдПред рд░рдгрдиреАрддрд┐, рдЬрдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ ConfigureAwait(false) рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░, рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ "рдЧреНрд░рд╛рд╣рдХ" рдкрд╕рдВрдж рдХреЗ рдХреЛрдб рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдореЗрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдореЗрдВ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ: CancellationToken token рдФрд░ bool continueOnCapturedContext ред рдФрд░ рдХреЛрдб рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


 public async Task<string> FooAsync( /*  */, CancellationToken token, bool continueOnCapturedContext) { // ... await Task.Delay(30, token).ConfigureAwait(continueOnCapturedContext); // ... return result; } 

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


рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрдиреНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЛрдб рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдЙрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


 //     : async Task ClientFoo() { // ""  ClientFoo   ,     //   FooAsync   . await FooAsync( /*  */, ancellationToken.None, false); //     . await FooAsync( /*  */, ancellationToken.None, false).ConfigureAwait(false); //... } // ,  . private void button1_Click(object sender, EventArgs e) { FooAsync( /*  */, _source.Token, false).GetAwaiter().GetResult(); button1.Text = "new text"; } 

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдкреВрд░реНрд╡рдЧрд╛рдореА рд╕реЗ рдореБрдЦреНрдп рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:


  1. рддрд╛рд▓реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕рднреА рдмреБрд░рд╛рдИ рдХреА рдЬрдбрд╝ рд╣реИрдВред рдпрд╣ рддрд╛рд▓реЗ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХреЛ, рд╕рдмрд╕реЗ рдмреБрд░реЗ рдореЗрдВ - рдЧрддрд┐рд░реЛрдз рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ;
  2. рдЙрд╕ рдЯреВрд▓ рдХреЛ рдЬрд╛рдиреЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ;
  3. рдпрджрд┐ рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдЙрдирдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рди рд╣реИ, рд▓рдЧрднрдЧ рд╕рд╣рдЬ рд╣реИ, рдФрд░ рдЧрд▓рдд рдПрдХ рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рднрд░рд╛ рд╣реИред

рдореИрдВрдиреЗ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЬреЛрдЦрд┐рдореЛрдВ рдФрд░ рдЙрдирдХреА рдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдФрд░ рд╕рд╛рде рд╣реА, рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдлрд▓ рд░рд╣рд╛, рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрд░реЛрдд рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ GitHub рдкрд░ MS рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╕реБрдЧрдорддрд╛ рд╕реЗ MS рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред


рдкреА рдПрд╕ рдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред


Source: https://habr.com/ru/post/hi463587/


All Articles