
C # 5.0 рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП async рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рднреА рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╕рддрд░реНрдХрддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреБрдбрд╝ рд╕рдХрддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдЕрднреНрдпрд╛рд╕ рдХрд╛рдо рдЖрдПрдВрдЧреЗред
рдХреЗрд╡рд▓ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВрдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП
Task
рдФрд░ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреБрдЫ рдЙрдкрд░рд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдСрдкрд░реЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдВрдмрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИрдУ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛, рддреЛ рдпреЗ рд▓рд╛рдЧрдд рдореБрдЦреНрдп рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдСрдкрд░реЗрд╢рди рдЫреЛрдЯрд╛ рд╣реИ рдпрд╛ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреАрдо рдиреЗ рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рдзрд┐
Async
рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЯрд╛рд╕реНрдХ рдкрд░ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВрдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕
async/await
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛
Task
рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓
async/await
рд╣реИред
public Task<Data> GetDataAsync() { return MyWebService.FetchDataAsync() .ContinueWith(t => new Data (t.Result)); }
public async Task<Data> GetDataAsync() { var result = await MyWebService.FetchDataAsync(); return new Data (result); }
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЫреЛрдЯреЗ рдУрд╡рд░рд╣реЗрдбреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреБрдЫ рд╣рдж рддрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ:
Task
рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдврд╝рддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдП рдЧрдП рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредAsync/await
рдПрдХ рдирдИ рдорд╢реАрди рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдмрдирд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рдХреЛрдб (рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╢реАрди рдХреЗ рд╕реНрдЯреИрдХ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред MSDN рдкрд░ рдЖрд▓реЗрдЦ рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ,
async/await
рдХрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░
Task
рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝реА рд╕реЗ рдЪрд▓реЗрдЧрд╛ред
рд╕рд╢рд░реНрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрдг рдЦрд╛рд▓реА рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдХрднреА-рдХрднреА рдЖрдк рдХреЗрд╡рд▓ рдХрд┐рд╕реА рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдПрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ,
NullReferenceException
рдХреЛ
NullReferenceException
рджреЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп
null
рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдб рдХрдо рдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
public async Task<Data> GetDataAsync(bool getLatestData) { Task<WebData> task = null; if (getLatestData) task = MyWebService.FetchDataAsync();
рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рдЦрд╛рд▓реА рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛:
public async Task<Data> GetDataAsync(bool getLatestData) { var task = getLatestData ? MyWebService.FetchDataAsync() : Empty<WebData>.Task;
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд╛рд░реНрдп рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public static class Empty<T> { public static Task<T> Task { get { return _task; } } private static readonly Task<T> _task = System.Threading.Tasks.Task.FromResult(default(T)); }
рдкреНрд░рджрд░реНрд╢рди: рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХреИрд╢ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВрдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╕рдордп рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
public Task<byte[]> GetContentsOfUrl(string url) { byte[] bytes; if (_cache.TryGetValue(url, out bytes))
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХреИрд╢ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░
рд░рд╣рд╛ рд╣реИ ред
public Task<byte[]> GetContentsOfUrl(string url) { Task<byte[]> bytes; if (!_cache.TryGetValue(url, out bytes)) { bytes = MyWebService.GetContentsAsync(url); _cache.Add(url, bytes); } return bytes; }
рдкреНрд░рджрд░реНрд╢рди: рд╕рдордЭреЗрдВ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреИрд╕реЗ рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддреА рд╣реИрдЬрдм рдЖрдк
async/await
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public static async Task FooAsync() { var data = await MyWebService.GetDataAsync(); var otherData = await MyWebService.GetOtherDataAsync(); Console.WriteLine("{0} = "1", data, otherdata); }
рдпрд╣ рдХрдИ рдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБ рдмрдирд╛рдПрдЧрд╛ред рджреЗрдЦреЗрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдзрд┐ рдЪрд░ рдХреЛ рдХреИрд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ:
[StructLayout(LayoutKind.Sequential), CompilerGenerated] private struct <FooAsync>d__0 : <>t__IStateMachine { private int <>1__state; public AsyncTaskMethodBuilder <>t__builder; public Action <>t__MoveNextDelegate; public Data <data>5__1; public OtherData <otherData>5__2; private object <>t__stack; private object <>t__awaiter; public void MoveNext(); [DebuggerHidden] public void <>t__SetMoveNextDelegate(Action param0); }
рдЯрд┐рдкреНрдкрдгреА 1. рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдиреЗ рд░рд╣рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рд░рд┐рдорд╛рд░реНрдХ 2. рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
await
рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХреЗ
Async
рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдЖрдВрддрд░рд┐рдХ рд╕реНрдЯреИрдХ рдкрд░ рдЬрд╛рдПрдЧрд╛:
public static async Task FooAsync() { var data = MyWebService.GetDataAsync(); var otherData = MyWebService.GetOtherDataAsync();
рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ MSDN рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ:
Async рдкреНрд░рджрд░реНрд╢рди: Async рдФрд░ Await рдХреА рд▓рд╛рдЧрдд рдХреЛ рд╕рдордЭрдирд╛ ред
рд╕реНрдерд┐рд░рддрд╛: async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред рдХрд╛рд░реНрдп рдирд╣реАрдВasync/await
Task.ContinueWith/Wait
рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд░рд╛рдЬреНрдп рдорд╢реАрди
Task.ContinueWith/Wait
рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред
Task.ContinueWith/Wait
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк
Task
рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛
await
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдореБрджреНрджреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред
рд╕реНрдерд┐рд░рддрд╛: рдЕрдкрдиреЗ рд╕рд┐рдВрдХ рд╕рдВрджрд░реНрдн рдХреЛ рдЬрд╛рдиреЗрдВ.NET рдХреЛрдб рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджрд░реНрдн рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ, рдХреЛрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
await
рдмрд╛рдж
await
рдХреЛрдб рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд┐рдВрдбреЛрдЬ рдпреВрдЖрдИ рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд╛рдж рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдерд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
Task.Factory.StartNew
рд╕рдВрджрд░реНрдн рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Windows UI рдереНрд░реЗрдб рдпрд╛ ASP.NET рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ред
рдРрд╕реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ, рдЧрддрд┐рд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдХреЛрдб рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред
public ActionResult ActionAsync() {
рд╕реНрдерд┐рд░рддрд╛: рдХрд╛рд░реНрдп рдХреЛ рдпрд╣реАрдВ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Wait
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВрдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ
Wait
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред (c
await
рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИред)
рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП
Wait
рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЬреИрд╕реЗ:
- рдпреВрдЖрдИ рдзрд╛рдЧреЗ
- ASP.NET рдкреНрд░рд╕рдВрдЧ
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрдкрдХреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ
Task
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рд░рдЦреЗрдВ:
public async Task<ActionResult> ActionAsync() {
рдпрджрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реБрдЖ рдХрд░рддреА рдереА рдХреНрдпреЛрдВрдХрд┐ рдердХрд╛рдК рдФрд░ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдерд╛, рд▓реЗрдХрд┐рди
async/await
рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде
async/await
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрдЯрд┐рд▓рддрд╛ рдЕрдм рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдЕрдм рдЖрдкрдХреЛ
ThreadPool
рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реИред
рд╕реНрдерд┐рд░рддрд╛: рдпрджрд┐ рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ ConfigureAwait
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдпрджрд┐ рдЖрдкрдХреЛ рдЗрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛
рдХрд░рдиреА рд╣реИ, рддреЛ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
ConfigureAwait
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдЖрдкрдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░реЗред рдЗрд╕рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдорд╛рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдпреВрдЖрдИ рдпрд╛
HttpContext
рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЖрдкрдХрд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рд╣реИ)ред
рдпрджрд┐ рдЖрдк рдПрдХ "рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ
Task
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдореЗрдВ
ConfigureAwait(false)
рдЬреЛрдбрд╝рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
private async Task<string> GetDataAsync() {
рд╕реНрдерд┐рд░рддрд╛: рд╕рдордЭреЗрдВ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВредрдЬрдм рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣рдирд╛ рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЙрд╕ рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ?
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдо рдмрд╣реБрдд рд╕реАрдзреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
- Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдХреЛрдб рдХреЛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ (рд╡реЗрдЯрд░)ред
public async Task<Data> GetContentsOfUrl(string url) {
Task
рдХреЗ рдбреЗрд▓реАрдЧреЗрдЯ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рдПрдХреНрд╕реЗрдкреНрд╢рди рдХреЛ рднреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ Task
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рд╡реЗрдЯрд░)ред
public Task<Data> GetContentsOfUrl(string url) { return Task<Data>.Factory.StartNew(() => {
- рдЯрд╛рд╕реНрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЙрд╕ рдХреЛрдб рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рдпрд╣ рд╡рд┐рдзрд┐ (рдХреЙрд▓рд░) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрдкрд╖реНрдЯ рд╣реИ):
public Task<Data> GetContentsOfUrl(string url) {
рдЖрдЦрд┐рд░реА рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ
Task
рдорд╛рдзреНрдпрдо рд╕реЗ
Task
рдЪреЗрди рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп
async/await
рдХрд░рдирд╛ рдкрд╕рдВрдж
async/await
рд╣реВрдВред
рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдХ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ)