рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: .NET рдореЗрдВ Async / Await рдмреЗрд╕реНрдЯ рдкреНрд░реИрдХреНрдЯрд┐рд╕

рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, "рд╕реА # рдбреЗрд╡рд▓рдкрд░" рдиреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред




Async / Await - рдкрд░рд┐рдЪрдп


Async / Await рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг C # рд╕рдВрд╕реНрдХрд░рдг 5.0 (2012) рдХреЗ рдмрд╛рдж рд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ рдФрд░ рдЖрдзреБрдирд┐рдХ .NET рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЧрдпрд╛ рд╣реИ - рдХрд┐рд╕реА рднреА рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА C # рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди, рд╕рдордЧреНрд░ рдЬрд╡рд╛рдмрджреЗрд╣реА рдФрд░ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

Async / Await, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ? рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЦрдВрдбрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рддреЛ рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╡рд┐рд╖рдп рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдЯреЗрдЯ рдорд╢реАрди (IAsyncStateMachine)


рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдЖрдкрдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣реБрдб рдХреЗ рддрд╣рдд рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ Async / Await рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рдзрд┐ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ IAsyncStateMachine рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреА рдкрджреНрдзрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рдпрд╣ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреА рдкрджреНрдзрддрд┐ рдХреЗ рд╕рднреА рдЪрд░ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЙрди рдЦрдВрдбреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдзрд╛рдЧрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХреЗ рдФрд░ рдЬрдм рдпрд╣ рд╣реЛ рд╕рдХреЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рд░рд╛рдЬреНрдп рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рджреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:

System.Threading.Tasks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;

using System.Diagnostics;

namespace AsyncAwait
{
    public class AsyncAwait
    {

        public async Task AsyncAwaitExample()
        {
            int myVariable = 0;

            await DummyAsyncMethod();
            Debug.WriteLine("Continuation - After First Await");
            myVariable = 1;

            await DummyAsyncMethod();
            Debug.WriteLine("Continuation - After Second Await");
            myVariable = 2;

        }

        public async Task DummyAsyncMethod()
        {
            // 
        }

    }
}

рджреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ

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



рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдирдП рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗ рд▓рд┐рдП рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдкрд░ <AsyncAwaitExample> d__0, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЖрдВрддрд░рд┐рдХ рдЪрд░ ┬лmyVariable┬╗рдЕрдм рдПрдХ рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░ рд╣реИ:



рд╣рдо рд░рд╛рдЬреНрдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ IAsyncStateMachineред рд░рд╛рдЬреНрдп рдорд╢реАрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИMoveNext(), рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдмрдбрд╝рд╛ рд╕реНрд╡рд┐рдЪред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ (рдкрд┐рдЫрд▓реЗ рдирд┐рд░рдВрддрд░рддрд╛ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде) рдХреЗ рдмрд╛рдж рд╡рд┐рдзрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред



рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд▓рд╛рд▓рд┐рддреНрдп рдПрдХ рдореВрд▓реНрдп рдкрд░ рдЖрддрд╛ рд╣реИред рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдк рдЬрд╛рдирддреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд▓реЙрдЬрд┐рдХ рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдкреАрдпреВ рдФрд░ рдХреЗрдмреА рдореЗрдореЛрд░реА рдЪрдХреНрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдУрд╡рд░рд╣реЗрдб рдХреА рдорд╛рддреНрд░рд╛ рдЬрд▓реНрджреА рд╕реЗ рдмрдврд╝ рд╕рдХрддреА рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдж рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЬрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╡рд╣рд╛рдВ Async / Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреА рдПрдХ рд╕реБрдВрджрд░ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡реАрдбрд┐рдпреЛ YouTube рдкрд░ рджреЗрдЦреЗрдВред

Async / Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░реЗрдВ


рдЖрдо рддреМрд░ рдкрд░ рджреЛ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ рдЬрд╣рд╛рдВ Async / Await рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИред

  • I / O рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп : рдЖрдкрдХрд╛ рдХреЛрдб рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛, рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛, рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЙрд▓ рдХрд░рдирд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ Async / Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ред
  • рд╕реАрдкреАрдпреВ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп : рдЖрдкрдХрд╛ рдХреЛрдб рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ Async / Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ Task.Run рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред



рд╕рднреА рддрд░рд╣ рд╕реЗ Async рдХрд░реЗрдВ


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

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

рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ async рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ!


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

Async рд╢реВрдиреНрдп рд╕реЗ рдмрдЪреЗрдВ


Async рд╢реВрдиреНрдп рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ async рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп async рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдмрдирд╛рдПрдБред

public async void AsyncVoidMethod()
{
    //!
}

public async Task AsyncTaskMethod()
{
    //!
}

Async рд╢реВрдиреНрдп рдФрд░ async рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ

рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • Async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдкрдХрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ :
рдЬрдм рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ Async рдЯрд╛рд╕реНрдХ рдпрд╛ Async рдЯрд╛рд╕реНрдХ <рдЯреА >рд╡рд┐рдзрд┐ рд╕реЗ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрдХрдбрд╝рд╛ рдФрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред Async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, async void рдкрджреНрдзрддрд┐ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рд╕реАрдзреЗ SynchronizationContext рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ async void рд╡рд┐рдзрд┐ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░ рд╕рдХреНрд░рд┐рдп рдерд╛ред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХреИрдкреНрдЪрд░ рдмреНрд▓реЙрдХ рдХрднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛ред

public async void AsyncVoidMethodThrowsException()
{
    throw new Exception("Hmmm, something went wrong!");
}

public void ThisWillNotCatchTheException()
{
    try
    {
        AsyncVoidMethodThrowsException();
    }
    catch(Exception ex)
    {
        //     
        Debug.WriteLine(ex.Message);
    }
}

Async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЬрд╣рд╛рдБ async void рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ async рдЯрд╛рд╕реНрдХ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдХрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред

public async Task AsyncTaskMethodThrowsException()
{
    throw new Exception("Hmmm, something went wrong!");
}

public async Task ThisWillCatchTheException()
{
    try
    {
        await AsyncTaskMethodThrowsException();
    }
    catch (Exception ex)
    {
        //    
        Debug.WriteLine(ex.Message);
    }
}

рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рд╛ рдФрд░ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

  • Async рд╢реВрдиреНрдп рддрд░реАрдХреЛрдВ рдЕрд╡рд╛рдВрдЫрд┐рдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдлреЛрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ : рдпрджрд┐ рдЖрдкрдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рд░рд┐рдЯрд░реНрди рдХреБрдЫ рднреА рдирд╣реАрдВ, (рдмрд┐рдирд╛ рдПрдХ "рдЯрд╛рд╕реНрдХ async рдЙрдкрдпреЛрдЧ <рдЯреА >рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП") рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВред
  • Async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ : рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреЛ async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ MSTest рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдпрд╛ рдХрд╛рд░реНрдп <T рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ >ред

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

рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рд░рд┐рдЯрд░реНрди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рд░рд┐рдЯрд░реНрди рдЯрд╛рд╕реНрдХ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ


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

рдХрднреА-рдХрднреА рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рд╕реНрдХ <рдЯреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ >рдФрд░ рджреВрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╛рдкрд╕реА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдЯрд╛рд╕реНрдХ <рдЯреА рд╣реЛред>(async T рдХреЗ рдмрдЬрд╛рдп)ред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЖрдк рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрдм рд╣рдо рдкрджреНрдзрддрд┐ рдХреЗ рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд╕ рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВред

public async Task<string> AsyncTask()

{
   //  !
   //...  -  
   //await -   ,  await  

   return await GetData();

}

public Task<string> JustTask()

{
   //!
   //...  -  
   // Task

   return GetData();

}

рд░рд┐рдЯрд░реНрди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рд░рд┐рдЯрд░реНрди рдЯрд╛рд╕реНрдХ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛

рджреЗрдВ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рд╕реНрдХ <рдЯреА >рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдЯрд░реНрди рддреБрд░рдВрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдб рдПрдХ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдХреЛрдб рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддреБрд░рдВрдд рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдЕрдЧрд▓реА рдЯрд┐рдк рджреЗрдЦреЗрдВред

рдХреЛрд╢рд┐рд╢ рдХреЗ рдЕрдВрджрд░ рд░рд┐рдЯрд░реНрди рдЯрд╛рд╕реНрдХ рдХреЛ рди рд▓рдкреЗрдЯреЗрдВ..рдЪреБрдиреЗрдВ {} рдпрд╛ {} рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

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

public Task<string> ReturnTaskExceptionNotCaught()

{
   try
   {
       // ...

       return GetData();

   }
   catch (Exception ex)

   {
       //     

       Debug.WriteLine(ex.Message);
       throw;
   }

}

public Task<string> ReturnTaskUsingProblem()

{
   using (var resource = GetResource())
   {

       // ...  ,     , ,    

       return GetData(resource);
   }
}

рдмреНрд▓реЙрдХ try..catch{}рдпрд╛ рдХреЗ рдЕрдВрджрд░ рд░рд┐рдЯрд░реНрди рдЯрд╛рд╕реНрдХ рдХреЛ рди рд▓рдкреЗрдЯреЗрдВusing{} ред рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдЗрд╕ рдереНрд░реЗрдб

рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ .Wait()рдпрд╛ .ResultрдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВGetAwaiter().GetResult()


рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП Async рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рдЬреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдорд╛рдиреНрдп рдЕрдкрд╡рд╛рдж рд▓реМрдЯрд╛рддрд╛ рд╣реИ редGetAwaiter().GetResult(). WaitResultAggregateExceptionGetAwaiter().GetResult()AggregateException

public void GetAwaiterGetResultExample()

{
   // ,    ,     AggregateException  

   string data = GetData().Result;

   // ,   ,      

   data = GetData().GetAwaiter().GetResult();
}

рдпрджрд┐ рдЖрдкрдХреЛ Async рдЯрд╛рд╕реНрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ GetAwaiter().GetResult().

рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

рдпрджрд┐ рд╡рд┐рдзрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдирд╛рдо рдореЗрдВ Async рдкреНрд░рддреНрдпрдп рдЬреЛрдбрд╝реЗрдВ


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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ.рдСрдирдлреЙрдЧрд░ рдПрд╡рд╛рдЗрдЯ (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП



.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ "рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "рдЖрдк рдкрд╣рд▓реЗ рдЬрд╣рд╛рдВ рдереЗ рд╡рд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рд╣реИред" рдЬрдм рднреА рдХреЛрдИ рдХрд╛рд░реНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИред

рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж .Post(), рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рдерд╛ред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЙрд╕реА ASP.NET рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЖрджрд┐ред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрд╕ рд╕рдВрджрд░реНрдн рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рдереЗред рдЬрдм Task.ConfigureAwait (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдЕрдм рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдкрд╣рд▓реЗ рдерд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдХреЛрдб рдЙрд╕ рдереНрд░реЗрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░рддрд╛ рд╣реИ рдФрд░ рдЧрддрд┐рд░реЛрдз рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

public async Task ConfigureAwaitExample()

{
   //   ConfigureAwait(false)   .

   var data = await GetData().ConfigureAwait(false);
}

рдЖрдорддреМрд░ рдкрд░, рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдХреЗ рд▓рд┐рдП ConfigureAwait (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдмреЗрд╣рддрд░ рдЬрд╡рд╛рдмрджреЗрд╣реА рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐ рдХреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдорддреМрд░ рдкрд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рдореЗрдВ рдзреНрдпрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд┐рдирдореЗрдВ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реИред

рдЕрдм ... ASP.NET Core рдореЗрдВ, Microsoft рдиреЗ SynchronizationContext рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЬреИрд╕реЗ рдпреВрдЖрдИ рдРрдк, рд▓рд┐рдЧреЗрд╕реА ASP.NET, рдЬрд╝рд╛рдорд░реАрди рдлреЙрд░реНрдо) рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ ред

рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЕрдЪреНрдЫреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдХреЛ рджреЗрдЦреЗрдВ ред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рд░рд┐рдкреЛрд░реНрдЯ


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

рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .NET IProgress <T рдЗрдВрдЯрд░рдлрд╝реЗрд╕ >рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ <T рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ >, рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЧрддрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЙрд▓рд░ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

.NET рдкреНрд░рдЧрддрд┐ <рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ >, IProgress <T рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди >, рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддрд░реНрдХ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░реЗрд╕ <рдЯреА >рдПрдХ рдПрдХреНрд╢рди <рдЯреА рдИрд╡реЗрдВрдЯ рдФрд░ рдХреЙрд▓рдмреИрдХ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ >- рджреЛрдиреЛрдВ рдХреЛ рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рде рдореЗрдВ, IProgress <T >рдФрд░ Progress <T >рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ <рдЯреА>рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЗрдВрдЯ, рдпрд╛ рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░рдЧрддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд, рд╡рд░реНрддрдорд╛рди рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рд╡рд░рдг, рдИрдЯреАрдП, рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдкреНрд░рдЧрддрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрдИ рдмрд╛рд░ рдкреНрд░рдЧрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдо рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░рдЧрддрд┐ рдХреЛ рдмрдбрд╝реЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Microsoft .NET рдмреНрд▓реЙрдЧ рдкрд░ рдЗрд╕ рд▓реЗрдЦ

рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╛рд░реНрдп рд░рджреНрдж рдХрд░реЗрдВ


рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЖрдо рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред .NET рдХреНрд▓рд╛рд╕ рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдХреИрдВрд╕рд┐рд▓реЗрд╢рдирдЯреЛрдХрди рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдкрд╛рд░реНрдЯреА рдХреЛрдб рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рджреНрджреАрдХрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

  1. рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд░рджреНрджреАрдХрд░рдг TokenSource рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
  2. рдХреЙрд▓рд░ рд░рджреНрдж рдХрд┐рдП рдЧрдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ API рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрдж рдХрд░рддрд╛ рд╣реИ рд░рджреНрдж рдХрд░реЗрдВрд╕реЗрд╡рд╛ рд░рджреНрдж рдХрд░реЗрдВрд╕реЗрдиреЛрдЯрд▓реЛрдХреЗрд╢рдирд╕реЗрдирдХреЛрд░реНрд╕ (CancellationTokenSource.Token)ред
  3. рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрдирд╕реЗ рд╕реЛрд░реНрд╕ (рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЙрдХреЗрдирд╕реЛрд░реНрд╕.рдХреИрдВрд╕реЗрд▓ ()) рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
  4. рдХрд╛рд░реНрдп рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред TrowIfCancellationRequested рд╡рд┐рдзрд┐ред

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

рдЖрдкрдХреЛ рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Microsoft .NET рдмреНрд▓реЙрдЧ рдкрд░ рдЗрд╕ рд▓реЗрдЦ

рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рдкреНрд░рдЧрддрд┐ рдФрд░ рдирд┐рд░рд╕реНрддреАрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ - рдЙрджрд╛рд╣рд░рдг


using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace TestAsyncAwait
{
   public partial class AsyncProgressCancelExampleForm : Form
   {
       public AsyncProgressCancelExampleForm()
       {
           InitializeComponent();
       }

       CancellationTokenSource _cts = new CancellationTokenSource();

       private async void btnRunAsync_Click(object sender, EventArgs e)

       {

           //   .

            <int>   ,          ,   ,    , ETA  . .

           var progressIndicator = new Progress<int>(ReportProgress);

           try

           {
               //   ,         

               await AsyncMethod(progressIndicator, _cts.Token);

           }

           catch (OperationCanceledException ex)

           {
               // 

               lblProgress.Text = "Cancelled";
           }
       }

       private void btnCancel_Click(object sender, EventArgs e)

       {
          // 
           _cts.Cancel();

       }

       private void ReportProgress(int value)

       {
           //    

           lblProgress.Text = value.ToString();

       }

       private async Task AsyncMethod(IProgress<int> progress, CancellationToken ct)

       {

           for (int i = 0; i < 100; i++)

           {
              //   ,     

               await Task.Delay(1000);

               //   

               if (ct != null)

               {

                   ct.ThrowIfCancellationRequested();

               }

               //   

               if (progress != null)

               {

                   progress.Report(i);
               }
           }
       }
   }
}

рд╕рдордп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ


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

рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ


рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдореБрдЭреЗ C # 7 рдпрд╛ 8 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рд╡реЗрдмрд┐рдирд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ ред

All Articles