рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд╡рд╛рдмрджреЗрд╣реА рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╡реЗрдм рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП Async / Await рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ C # 5 рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ рдереАред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХрд▓ рд╕реНрдХреЗрд▓рд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред Microsoft рджреНрд╡рд╛рд░рд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдиреЗ рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫреА рдкреНрд░рддрд┐рд╖реНрдард╛ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реИред
рдореМрдЬреВрджрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдХреБрдЫ async Task<int> DoAnythingAsync()
рд╡рд┐рдзрд┐ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реИред рдЙрд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдПрдХ рдЕрд░реНрде рд╣реИред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ yield
рдХреАрд╡рд░реНрдб рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ IEnumerable<int>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдпрджрд┐ рдЖрдк async/await
рдлрд╝рдВрдХреНрд╢рди рдФрд░ yield
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбреЗрдЯрд╛ рдкреБрд▓ , рдпрд╛ рдкреБрд▓ рдЖрдзрд╛рд░рд┐рдд рдПрдиреНрдпреВрдорд░реЗрд╢рди рдЖрдзрд╛рд░рд┐рдд рдПрдиреНрдпреВрдорд░реЗрд╢рди рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрд╕рд┐рдВрдХреНрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ F # рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
C # 8 рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдирдИ рдХреНрд╖рдорддрд╛ рдПрдХрд▓ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рд╕реАрдорд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрдВрдЧреЗ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд▓рдВрдмрд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╣реАрдВ рд╕реЗ рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдпрд╛ рдЙрдкрд▓рдмреНрдз рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреЗред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
foreach await (var streamChunck in asyncStreams) { Console.WriteLine($тАЬReceived data count = {streamChunck.Count}тАЭ); }
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдЖрд░рдПрдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред Rx
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ (RxJava) рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (RxJS)ред
Rx рдПрдХ рдкреБрд╢ рдкреБрд╢ рдореЙрдбрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (рдЯреЗрд▓ рдбреЛрдиреНрдЯ рдЖрд╕реНрдХ рд╕рд┐рджреНрдзрд╛рдВрдд), рдЬрд┐рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА IEnumerable рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрдм рдЙрдкрднреЛрдХреНрддрд╛ Rx рдореЙрдбрд▓ рдореЗрдВ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЛрдб рдореЗрдВ рдХрддрд╛рд░ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдЗрд╕реЗ рд░рд╕реАрдж рдХреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ (рдЬреИрд╕реЗ Rx) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ (рдЬреИрд╕реЗ IEnumerable) рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдореЙрдбрд▓ рдХрд┐рд╕ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рд╕рдВрдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рдФрд░ рд▓рд╛рднреЛрдВ рдХреА рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдбреЗрдореЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдкреБрд▓рд┐рдВрдЧ рдбреЗрдЯрд╛ (рдкреБрд▓-) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛

рдЕрдВрдЬреАрд░ред -1- рдбреЗрдЯрд╛ рдкреБрд╢рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреБрд▓рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛
рдпреЗ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрдЬреАрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред -1ред рдПрдХ рдкреБрд▓-рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдореЗрдВ, рдЙрдкрднреЛрдХреНрддрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдкреБрд╢ рдкреБрд╢ рдореЙрдбрд▓ рд╣реИред рдпрд╣рд╛рдВ, рдкреНрд░рджрд╛рддрд╛ рдХрддрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдбреЗрдЯрд╛-рдкреБрд▓ рдореЙрдбрд▓ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рджрд╛рддрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝реА рд╕реЗ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреЗрдЬреА рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдЗрд╕рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдореЙрдбрд▓ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рджреЗрд░реА рди рд╣реЛред
рдЖрд░рдПрдХреНрд╕ рдФрд░ рдЕрдХреНрдХрд╛ рд╕реНрдЯреНрд░реАрдо (рдПрдХ рдкреНрд░рд╡рд╛рд╣-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓) рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрда рдХреЗ рджрдмрд╛рд╡ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рдХреЛ рдкреБрд╢ рдФрд░ рдЦреАрдВрдЪрдиреЗ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдзреАрдорд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдПрдХ рддреЗрдЬ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рд╕реЗ рдЕрдЧрд▓реЗ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрдд рддрдХ рдкреВрдЫреЗрдЧрд╛ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рдЧреЗ рдХреА рдкреВрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
// (count) static int SumFromOneToCount(int count) { ConsoleExt.WriteLine("SumFromOneToCount called!"); var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; } return sum; } // : const int count = 5; ConsoleExt.WriteLine($"Starting the application with count: {count}!"); ConsoleExt.WriteLine("Classic sum starting."); ConsoleExt.WriteLine($"Classic sum result: {SumFromOneToCount(count)}"); ConsoleExt.WriteLine("Classic sum completed."); ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine);
рдирд┐рд╖реНрдХрд░реНрд╖:

рд╣рдо рдкреИрджрд╛рд╡рд╛рд░ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
static IEnumerable<int> SumFromOneToCountYield(int count) { ConsoleExt.WriteLine("SumFromOneToCountYield called!"); var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; yield return sum; } }
рд╡рд┐рдзрд┐ рдХреЙрд▓
const int count = 5; ConsoleExt.WriteLine("Sum with yield starting."); foreach (var i in SumFromOneToCountYield(count)) { ConsoleExt.WriteLine($"Yield sum: {i}"); } ConsoleExt.WriteLine("Sum with yield completed."); ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine);
рдирд┐рд╖реНрдХрд░реНрд╖:

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рднрд╛рдЧреЛрдВ рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рднреА рдореВрд▓реНрдп рдирд╣реАрдВред рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рд╛рд░рд╛рдВрд╢ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ: рд╕рдорди рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреЛрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рдереНрд░реЗрдбреНрд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рдЖрдЗрдП, рдкрд╣рд▓реЗ SumFromOneToCount рддрд░реАрдХреЗ (рдЙрдкрдЬ рдХреЗ рдмрд┐рдирд╛) рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд╕ рдореИрдЬрд┐рдХ рд╢рдмреНрдж рд▓рд╛рдЧреВ рдХрд░реЗрдВред
static async Task<int> SumFromOneToCountAsync(int count) { ConsoleExt.WriteLine("SumFromOneToCountAsync called!"); var result = await Task.Run(() => { var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; } return sum; }); return result; }
рд╡рд┐рдзрд┐ рдХреЙрд▓
const int count = 5; ConsoleExt.WriteLine("async example starting."); // . , . , . var result = await SumFromOneToCountAsync(count); ConsoleExt.WriteLine("async Result: " + result); ConsoleExt.WriteLine("async completed."); ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine);
рдирд┐рд╖реНрдХрд░реНрд╖:

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рдЕрдм рдЧрдгрдирд╛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдПрдХрд▓ рдорд╛рди рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЖрд╡рд░реНрддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ (рдЙрдкрдЬ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ) рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдпреЛрдЬрди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рд░рд╛рдПрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ C # 8 рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдпрд╛ рдЖрдзреБрдирд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рдирд╛ред
рдЖрдЗрдП рдЗрд╕реЗ C # рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореИрдВ async рдХреАрд╡рд░реНрдб рдХреЛ SumFromOneToCountYield рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреЛрдбрд╝реВрдВрдЧрд╛:

рдЕрдВрдЬреАрд░ред -2- рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрдкрдЬ рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ред
рдЬрдм рд╣рдо Async рдХреЛ SumFromOneToCountYield рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред
рдЖрдЗрдП рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЖрдЬрдорд╛рдПрдВред рд╣рдо рдЙрдкрдЬ рдХреАрд╡рд░реНрдб рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рдореНрди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
static async Task<IEnumerable<int>> SumFromOneToCountTaskIEnumerable(int count) { ConsoleExt.WriteLine("SumFromOneToCountAsyncIEnumerable called!"); var collection = new Collection<int>(); var result = await Task.Run(() => { var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; collection.Add(sum); } return collection; }); return result; }
рд╡рд┐рдзрд┐ рдХреЙрд▓
const int count = 5; ConsoleExt.WriteLine("SumFromOneToCountAsyncIEnumerable started!"); var scs = await SumFromOneToCountTaskIEnumerable(count); ConsoleExt.WriteLine("SumFromOneToCountAsyncIEnumerable done!"); foreach (var sc in scs) { // , . . ConsoleExt.WriteLine($"AsyncIEnumerable Result: {sc}"); } ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine);
рдирд┐рд╖реНрдХрд░реНрд╖:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдмрдиреА рд╣реБрдИ рд╣реИред рдкрд░рд┐рдгрд╛рдо (рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдПрдХрд▓ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╡рд┐рд▓рдВрдм рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдореЛрдб рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдерд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Ix (Rx рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛), рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рдЧреЗ, C # рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЗрдП рдЕрдкрдиреЗ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
static async Task ConsumeAsyncSumSeqeunc(IAsyncEnumerable<int> sequence) { ConsoleExt.WriteLineAsync("ConsumeAsyncSumSeqeunc Called"); await sequence.ForEachAsync(value => { ConsoleExt.WriteLineAsync($"Consuming the value: {value}"); // Task.Delay(TimeSpan.FromSeconds(1)).Wait(); }); } static IEnumerable<int> ProduceAsyncSumSeqeunc(int count) { ConsoleExt.WriteLineAsync("ProduceAsyncSumSeqeunc Called"); var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; // Task.Delay(TimeSpan.FromSeconds(0,5)).Wait(); yield return sum; } }
рд╡рд┐рдзрд┐ рдХреЙрд▓
const int count = 5; ConsoleExt.WriteLine("Starting Async Streams Demo!"); // . . IAsyncEnumerable<int> pullBasedAsyncSequence = ProduceAsyncSumSeqeunc(count).ToAsyncEnumerable(); ConsoleExt.WriteLineAsync("X#X#X#X#X#X#X#X#X#X# Doing some other work X#X#X#X#X#X#X#X#X#X#"); // ; . var consumingTask = Task.Run(() => ConsumeAsyncSumSeqeunc(pullBasedAsyncSequence)); // . , . consumingTask.Wait(); ConsoleExt.WriteLineAsync("Async Streams Demo Done!");
рдирд┐рд╖реНрдХрд░реНрд╖:

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

рдЕрдВрдЬреАрд░ред -3- рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбреЗрдЯрд╛ рдкреБрд▓рд┐рдВрдЧ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдкреБрд▓рд┐рдВрдЧ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред

рдЕрдВрдЬреАрд░ред -4- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдкреБрд▓рд┐рдВрдЧ рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдЧреНрд░рд╛рд╣рдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рдбреЗрдЯрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЦреАрдВрдЪрдирд╛
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдлрд┐рд░, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЧреНрд░рд╛рд╣рдХ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПред рдпрд╣ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рд╕реЗ рдерд╛ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рдЧреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдерд╛ред рдЕрдВрдЬреАрд░ рдореЗрдВред -5- рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдВрдЬреАрд░ред -5- рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрдХреНрд░рдо (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рд░рд╛рдУрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдирд╛ред рдЧреНрд░рд╛рд╣рдХ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рдЧреЗ
IEnumerable<T>
рдФрд░ IEnumerator<T>
рджреЛ рдирдП IAsyncEnumerable<T>
рдФрд░ IAsyncEnumerator<T>
рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдиреАрдЪреЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> GetAsyncEnumerator(); } public interface IAsyncEnumerator<out T> : IAsyncDisposable { Task<bool> MoveNextAsync(); T Current { get; } } // public interface IAsyncDisposable { Task DiskposeAsync(); }
InfoQ рдореЗрдВ, рдЬреЛрдирд╛рдерди рдПрд▓рди рдХреЛ рдпрд╣ рд╡рд┐рд╖рдп рд╕рд╣реА рд▓рдЧрд╛ред рдпрд╣рд╛рдВ рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирдХреЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдлреЛрдХрд╕ Task<bool> MoveNextAsync()
рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рдмреВрд▓ рд╕реЗ Task<bool>
рдкрд░рд┐рд╡рд░реНрддрд┐рдд Task<bool>
, bool IEnumerator.MoveNext()
)ред рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рднреА рдЧрдгрдирд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрдЧреАред рдЙрдкрднреЛрдХреНрддрд╛ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреЛ рдХрдм рддрдп рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЙрдбрд▓ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдбреЗрдЯрд╛ рдкреБрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП, рдЖрдк IAsyncDisposable
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рдЧреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред
рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕
рдЕрдВрддрд┐рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
foreach await (var dataChunk in asyncStreams) { // yield . }
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рдПрдХрд▓ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдиреНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП, рдореВрд▓реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреБрди: рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ Microsoft рдЙрджрд╛рд╣рд░рдг
рдореИрдВрдиреЗ Microsoft рдХреЗ рдбреЗрдореЛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд░реЗ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдЙрджрд╛рд╣рд░рдг рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдзрд╛рд░рд╛ (20,000 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА) рдмрдирд╛рдиреЗ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди, рд╕рд░рдгреА рд╕реЗ 8 KB рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЪрд░рдг (1) рдореЗрдВ, рдПрдХ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛ рдРрд░реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрдореА рдореВрд▓реНрдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░, рдЪрд░рдг (2) рдХреЗ рджреМрд░рд╛рди, рдЪреЗрдХрд╕рдо рдирд╛рдордХ рдПрдХ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреЗрдХрд╕рдо рд╡рд╛рд▓реЗ рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЧрдгрдирд╛ рдХреЗ рдпреЛрдЧ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдПрдХ рд╕рд░рдгреА рдФрд░ рдПрдХ рдЪреЗрдХрд╕рдо рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд░рдг (3) рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд░рдг (4) рдореЗрдВ AsEnumarble
рдПрдХреНрд╕рдЯреЗрдВрд╢рди AsEnumarble
(рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдирд╛рдо AsAsyncEnumarble) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ 8 KB (рдмрдлрд╝рд░рд╕рд╛рдЗрдЬрд╝ = 8000 рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ (6)) рдХреА рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рд░рд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ
рдпрд╣ рдЖрдорддреМрд░ рдкрд░ IAsyncEnumerable рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдСрдкрд░реЗрд╢рди рдбреЗрдореЛ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░рдг (5) рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЪрд░рдг (7) рдореЗрдВ foreach
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реНрдЯреНрд░реАрдо рд╕реЗ 8 KB рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдЦреАрдВрдЪрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрддреА рд╣реИ: рдЬрдм рдЙрдкрднреЛрдХреНрддрд╛ (рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ) рдбреЗрдЯрд╛ рдХрд╛ рдЕрдЧрд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рддрд╛ (рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рд░рдгреА) рд╕реЗ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЬрдм рдЪрдХреНрд░ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪреЗрдХрд╕рдо рдХреЗ рд▓рд┐рдП 'c' рдХреЗ рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрджрдо (8) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрджреЗрд╢ "рдЪреЗрдХрд╕рдо рдореИрдЪ" рджрд┐рдЦрд╛рдПрдЧрд╛ред
Microsoft рдбреЗрдореЛ рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рдВрдбреЛ:

рдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдордиреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдереНрд░реЗрдбреНрд╕ рдХреЛ рджреЗрдЦрд╛, рдЬреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВ рдЬреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдХрдИ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдЧрд▓реЗ рдбреЗрдЯрд╛ рддрддреНрд╡ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ IObservable<T>
рдбреЗрдЯрд╛ рдкреБрд╢ рдореЙрдбрд▓ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдорд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдзрд╛рд░рд╛рдПрдВ рдЖрдкрдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдЬрдм рд╡рд╣ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрдЧрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рднреА рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреНрдпрд╛ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреЗрдЦрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде Microsoft рдмрд┐рд▓реНрдб рдбреЗрдореЛ рдХреЛрдб ( 7тАУ9 рдордИ, 2018 // рд╕рд┐рдПрдЯрд▓, WA ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рднреА рджреЗрдЦрд╛ ред
