рдЖрдкрдХреЗ рдкрд╛рд╕ .NET 4.0 рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдФрд░ рдЖрдк рдХреЙрд▓рдмреИрдХ рд╕реЗ "рдиреВрдбрд▓реНрд╕" рд╕реЗ рдердХ рдЧрдП рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреАрдо рд▓реАрдбрд░ рдиреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд░реНрдЧреАрдп рджрдВрдб рдХреА рдзрдордХреА рджреА рд╣реИ? рдпрджрд┐ рдПрдХ рдврд╛рдВрдЪреЗ рдФрд░ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкрд░ рдПрдХ рдкреИрдЪ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ
рдпрд╣рд╛рдВ рдЖрдк
рд╣реИрдВ ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдФрд░ рдЙрдкрд╛рдп рд╣реИред

(
рдЧреБрд░реБ рдХреЗ рд▓рд┐рдП: рдЙрдкрдЬ'рд╣реМрдВ рдкрд░ рдХреЛрдЖрдЙрдЯ рдХреЗ рдЕрдВрджрд░ )
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
Async рд╡рд┐рдзрд┐ рдПрдХ
coroutine рд╣реИ рдЬреЛ рд╣рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдирд┐рдХрд▓рддреА рд╣реИ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ (рд▓реЗрдЦрдХ
рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╣рдореЗрд╢рд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдк "рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рд╕рдмрдиреЗрдЯ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдЬ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрд░рдЖрдЙрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдХрд▓реНрдкрдирд╛
рдореИрдВ C # 5.0 рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рд╕рд╛рде рд╣реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдРрд╕рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ:
private IEnumerable Login(...) {
рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдПрд╕реНрдХрд┐рдВрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЛрдб
рдпрд╣рд╛рдБ рд╣реИ ред
рдСрдкрд░реЗрд╢рди рдХрд╛ рддрдВрддреНрд░ рд╕рд░рд▓ рд╣реИ:
- рд░реВрдЯ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
- рдкреБрдирд░рд╛рд╡реГрддрд┐ рдШреБрдорд╛рдПрдБ
- рдпрджрд┐ рдЯрд╛рд╕реНрдХ рд▓реМрдЯрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдирдВрдмрд░ 2 рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде ContinueWith рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
- рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рдЧрдИ, рддреЛ рдШреЛрдбрд╝реЗ рдХреА рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ
- рдпрджрд┐ рдорд╛рди рд▓реМрдЯрд╛, рддреЛ рджрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдЯрд╛рд╕реНрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ
- рдпрджрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рдирдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдЯрд╛рд╕реНрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рдбрд┐рд╕реНрдкреЛрдЬ рдХреЛ рдЗрдЯреНрд░реЗрдЯрд░ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ / рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред
рдЖрдк
FromIterator рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private IEnumerable Login(...) { ... } Task loginTask = TaskUtils.FromIterator(this.Login(...));
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рд░рд╛рдЬреНрдп - рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬреЛ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧреА
- рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпред TaskCreationOptions рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ред рд╕рд╣реА рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдХрд╛рд░реНрдп рдПрдХ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди - рдПрд╕реНрдХрд┐рдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди, рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рдирд┐рд╖реНрдХрд░реНрд╖
рдкреЗрд╢реЗрд╡рд░реЛрдВ:
- рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рд╕рд╛рдл
- рдЖрдк рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд░ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ, рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝
- рдкреИрдЪ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ
- рдореЛрдиреЛ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
рд╡рд┐рдкрдХреНрд╖:
- Async рд╡рд┐рдзрд┐ IEnumerable рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЯрд╛рд╕реНрдХ рдирд╣реАрдВред рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдмрдирд╛рдиреА рдкрдбрд╝рддреА рд╣реИ рдЬреЛ рдЯрд╛рд╕реНрдХ рд▓реМрдЯрд╛рддреА рд╣реИред
- рдЖрдк рдХреЗрд╡рд▓ рдЯрд╛рд╕реНрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- "рдЕрдкреЗрдХреНрд╖рд┐рдд" рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ (ContinueWith рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд░реВрдЯ рдХрд╛рд░реНрдп рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдЕрдм рдПрд╕реНрдХрд┐рдВрд╕ рд╡рд┐рдзрд┐ рдкрд░ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред
- рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ (рдЯрд╛рд╕реНрдХрдмреБрд░реНрдЯрд▓) рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрдм рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ ContinueWith рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЬреАрд╕реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦрдгреНрдбреЛрдВ рдХреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд╛рда рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреАрдПрдо рдХреЛ рднреЗрдЬреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб