рд╡реЗ рдЖрдкрдХреЗ рдХреЙрд▓рдмреИрдХ рдкрд░ рд╣рдВрд╕рддреЗ рд╣реИрдВ рдпрд╛ "рдЧрд░реАрдмреЛрдВ рдХреЗ рд▓рд┐рдП" рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ

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


( рдЧреБрд░реБ рдХреЗ рд▓рд┐рдП: рдЙрдкрдЬ'рд╣реМрдВ рдкрд░ рдХреЛрдЖрдЙрдЯ рдХреЗ рдЕрдВрджрд░ )

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ

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

рд╕рдВрдХрд▓реНрдкрдирд╛

рдореИрдВ C # 5.0 рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рд╕рд╛рде рд╣реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдРрд╕рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ:
private IEnumerable Login(...) { // ... // get user id, if not specified if (string.IsNullOrEmpty(uid)) { var getUserIdTask = lient.GetUserId(...); yield return getUserIdTask; // await uid= getUserIdTask.Result.uid; } // login var loginTask = lient.Login(...); yield return loginTask; // await var sessionId = loginTask.Result.SessionId; // getting user's profile var getUserInfoTask = lient.GetUserInfo(...); yield return getUserInfoTask; // await var userInfo = getUserInfoTask.Result; // ... yield return userInfo; // return } 

рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдПрд╕реНрдХрд┐рдВрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рдбрд┐рд╕реНрдкреЛрдЬ рдХреЛ рдЗрдЯреНрд░реЗрдЯрд░ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ / рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред

рдЖрдк FromIterator рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 private IEnumerable Login(...) { ... } Task loginTask = TaskUtils.FromIterator(this.Login(...)); //     Task<UserInfo> loginTask = TaskUtils.FromIterator<UserInfo>(this.Login(...)); 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рдирд┐рд╖реНрдХрд░реНрд╖

рдкреЗрд╢реЗрд╡рд░реЛрдВ:



рд╡рд┐рдкрдХреНрд╖:


рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦрдгреНрдбреЛрдВ рдХреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╛рда рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреАрдПрдо рдХреЛ рднреЗрдЬреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб

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


All Articles