рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, "рд╕реА # рдбреЗрд╡рд▓рдкрд░" рдиреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред
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()
{
return await GetData();
}
public Task<string> JustTask()
{
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().
Wait
Result
AggregateException
GetAwaiter().GetResult()
AggregateException
public void GetAwaiterGetResultExample()
{
string data = GetData().Result;
data = GetData().GetAwaiter().GetResult();
}
рдпрджрд┐ рдЖрдкрдХреЛ Async рдЯрд╛рд╕реНрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ GetAwaiter().GetResult().
рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ редрдпрджрд┐ рд╡рд┐рдзрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдирд╛рдо рдореЗрдВ Async рдкреНрд░рддреНрдпрдп рдЬреЛрдбрд╝реЗрдВ
рдпрд╣ .NET рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрдиреНрд╡реЗрдВрд╢рди рд╣реИ рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ (рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдпрд╛ рд╡реЗрдм рдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рднреЗрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)редрдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ.рдСрдирдлреЙрдЧрд░ рдПрд╡рд╛рдЗрдЯ (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ "рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "рдЖрдк рдкрд╣рд▓реЗ рдЬрд╣рд╛рдВ рдереЗ рд╡рд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рд╣реИред" рдЬрдм рднреА рдХреЛрдИ рдХрд╛рд░реНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИредрдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж .Post()
, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рдерд╛ред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЙрд╕реА ASP.NET рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЖрджрд┐редрд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрд╕ рд╕рдВрджрд░реНрдн рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рдереЗред рдЬрдм Task.ConfigureAwait (рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдЕрдм рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдкрд╣рд▓реЗ рдерд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдХреЛрдб рдЙрд╕ рдереНрд░реЗрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░рддрд╛ рд╣реИ рдФрд░ рдЧрддрд┐рд░реЛрдз рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИредpublic async Task ConfigureAwaitExample()
{
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 рдХреНрд▓рд╛рд╕ рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдХреИрдВрд╕рд┐рд▓реЗрд╢рдирдЯреЛрдХрди рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдкрд╛рд░реНрдЯреА рдХреЛрдб рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредрд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рджреНрджреАрдХрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:- рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд░рджреНрджреАрдХрд░рдг TokenSource рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
- рдХреЙрд▓рд░ рд░рджреНрдж рдХрд┐рдП рдЧрдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ API рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрдж рдХрд░рддрд╛ рд╣реИ рд░рджреНрдж рдХрд░реЗрдВрд╕реЗрд╡рд╛ рд░рджреНрдж рдХрд░реЗрдВрд╕реЗрдиреЛрдЯрд▓реЛрдХреЗрд╢рдирд╕реЗрдирдХреЛрд░реНрд╕ (CancellationTokenSource.Token)ред
- рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрдирд╕реЗ рд╕реЛрд░реНрд╕ (рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЙрдХреЗрдирд╕реЛрд░реНрд╕.рдХреИрдВрд╕реЗрд▓ ()) рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
- рдХрд╛рд░реНрдп рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред 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 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рд╡реЗрдмрд┐рдирд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ ред