C # рдореЗрдВ Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ: рдЕрд╡рдзрд╛рд░рдгрд╛, рдЖрдВрддрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди, рдЙрдкрдпреЛрдЧреА рдЯреНрд░рд┐рдХреНрд╕

рд╢реБрдн рджрд┐рдиред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдПрдХ рдРрд╕реЗ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ C # рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рдЕрдиреБрдпрд╛рдпреА рдХреЛ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд▓рдЧрд╛ - рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдпрд╛ рдЖрдо рд▓реЛрдЧреЛрдВ рдореЗрдВ, async / рдкреНрд░рддреАрдХреНрд╖рд╛ред Microsoft рдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ - рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╖рдп рдХрд╛рдлреА рдмрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИред рдпрд╣ рдХрдИ, рдкреНрд░рддреНрдпреЗрдХ рдиреЗ рдЕрдкрдиреА рд╢реИрд▓реА рдореЗрдВ рдХрд╣рд╛ рдерд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЪреНрдЫреЗ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЧрд▓рдд рдзрд╛рд░рдгрд╛рдПрдБ рд╣реИрдВред рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЧрд╣рд░рд╛рдИ рдпрд╛ рд╕рдордЭ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЪрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВред



рд╡рд┐рд╖рдп / рдЕрдзреНрдпрд╛рдп рдХрд╡рд░:

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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛


рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рдирдП рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдРрд╕реА рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ред рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдИ рднреА рджрд╛рд╡рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рд░реБрджреНрдз рдереНрд░реЗрдбреНрд╕ CPU рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рд░рд┐рд╢ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдмрд╛рдж рд╡рд╛рд▓реА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд▓рдЧрддреА рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд┐рдЫрд▓реЗ 2 рдЕрдВрдХ рд╕рдорд╛рди рд╣реИрдВред

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

рдзреАрдорд╛ рдХрд╛рдо рдФрд░ рднреА рдмреЗрддреБрдХрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рдо рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╣реИред рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред

рдмрд╛рд░рд┐рд╢ рдХреА рдЪреБрдиреМрддреА рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ .NET рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :

  1. рдИрдПрдкреА (рдИрд╡реЗрдВрдЯ-рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреИрдЯрд░реНрди) - рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╣рд╛рдЗрдХ рдЙрди рдШрдЯрдирд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдЧ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐
  2. рдПрдкреАрдПрдо (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓) - 2 рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рддред BeginSmth рд╡рд┐рдзрд┐ IAsyncResult рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрддрд╛ рд╣реИред EndSmth рд╡рд┐рдзрд┐ IAsyncResult рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд╕рдордп рд╕реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ EndSmth рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдереНрд░реЗрдб рдЕрд╡рд░реБрджреНрдз рд╣реИ)
  3. TAP (рдЯрд╛рд╕реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреИрдЯрд░реНрди) рд╕рдорд╛рди async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реИ (рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдпреЗ рд╢рдмреНрдж рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдЯрд╛рд╕реНрдХ рдФрд░ рдЯрд╛рд╕реНрдХ <TResult> рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджрд┐рдП, рд▓реЗрдХрд┐рди async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ)

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрддрдирд╛ рд╕рдлрд▓ рдерд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднреВрд▓ рдЧрдпрд╛ред рддреЛ, рдпрд╣ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдЯрд╛рд╕реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреИрдЯрд░реНрдиред рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдФрд░ рд╕рдВрдХрд▓рди рдХреА рд╕реНрдерд┐рддрд┐


рдорд╛рдирдХ TAP- рд╢реИрд▓реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП :

  1. рдЯрд╛рд╕реНрдХ, рдЯрд╛рд╕реНрдХ <T>, рдпрд╛ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП (рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ)ред C # 7 рдореЗрдВ рдЯрд╛рд╕реНрдХ рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ (рдЕрдВрддрд┐рдо рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ) рдЖрдПред C # 8 рдореЗрдВ, IAsyncEnumerable <T> рдФрд░ IAsyncEnumerator <T> рдХреЛ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
  2. рддрд╛рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдПрд╕реНрдХрд┐рдВрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЕрдВрджрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реЛред рдпреЗ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ async рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рд╡рд┐рдкрд░реАрдд рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд░реНрде рд╣реИ
  3. рд╢рд╛рд▓реАрдирддрд╛ рдХреЗ рд▓рд┐рдП, Async рдкреНрд░рддреНрдпрдп рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдмреЗрд╢рдХ, рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд╛рдиреЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫреЗ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд░рджреНрджрдХрд░рдг рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ)

рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдЧрдВрднреАрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╡реЗ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред

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

рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рд╢рд░реНрддреЗрдВ рднреА рд╣реЛрддреА рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрд╕ рдкрд░ рдЖрд╡реЗрджрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

  1. рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рдпрд╛ рдЖрдВрддрд░рд┐рдХ) GetAwaiter () рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред
  2. рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ INotifyCompletion рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп OnCompleted (рдХреНрд░рд┐рдпрд╛ рдирд┐рд░рдВрддрд░рддрд╛) рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╕рдВрдкрддреНрддрд┐ рдмреВрд▓ IsCompleted, рд╢реВрдиреНрдп GetResult () рд╡рд┐рдзрд┐ред рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯ рдХреА рдЙрдореНрдореАрдж рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдВрдЯ
public class Program { public static async Task Main() { await 1; } } public static class WeirdExtensions { public static AnyTypeAwaiter GetAwaiter(this int number) => new AnyTypeAwaiter(); public class AnyTypeAwaiter : INotifyCompletion { public bool IsCompleted => false; public void OnCompleted(Action continuation) { } public void GetResult() { } } } 



TAP рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдпрд╣ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдЬрдВрдЧрд▓ рдореЗрдВ рдЬрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ TAP рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ: рдкреНрд░рд╢реНрди рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдореИрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рднреАрддрд░ рдмреБрд▓рд╛рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдореИрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд╣реВрдВрдЧрд╛ред

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

 public static async Task DelayOperationAsync() //   { BeforeCall(); Task task = Task.Delay(1000); //  AfterCall(); await task; AfterAwait(); } 

рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред

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

    рдпрджрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдорд╛рди рд░реВрдк рд╕реЗ, рдЙрд╕реА рдереНрд░реЗрдб рдореЗрдВ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред

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


рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗред рд╕реНрдЯреЗрдЯ рдорд╢реАрди


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

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реБрдЪрд┐ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдореВрд╡рдореЗрдВрдЯ рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд╣ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдерд╛ред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдорд╢реАрди рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред MoveNext рд╡рд┐рдзрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИред рд░рд╛рдЬреНрдп рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдЙрд╕рдХреЗ рдареАрдХ рдЙрд╕реА рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, 100 рдмрд╛рд░ рд╕реБрдирдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1 рдмрд╛рд░ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛, рдЪрд░ рдирд╛рдордХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рдЯрд┐рдкреНрдкрдгреА рдХреАред

рд╕реНрд░реЛрдд рдХреЛрдб
 public static async Task Delays() { Console.WriteLine(1); await Task.Delay(1000); Console.WriteLine(2); await Task.Delay(1000); Console.WriteLine(3); await Task.Delay(1000); Console.WriteLine(4); await Task.Delay(1000); Console.WriteLine(5); await Task.Delay(1000); } 


рдареВрдВрда рд╡рд┐рдзрд┐
 [AsyncStateMachine(typeof(DelaysStateMachine))] [DebuggerStepThrough] public Task Delays() { DelaysStateMachine stateMachine = new DelaysStateMachine(); stateMachine.taskMethodBuilder = AsyncTaskMethodBuilder.Create(); stateMachine.currentState = -1; AsyncTaskMethodBuilder builder = stateMachine.taskMethodBuilder; taskMethodBuilder.Start(ref stateMachine); return stateMachine.taskMethodBuilder.Task; } 


рд╕реНрдЯреЗрдЯ рдорд╢реАрди
 [CompilerGenerated] private sealed class DelaysStateMachine : IAsyncStateMachine { //  ,     await   //       await'a public int currentState; public AsyncTaskMethodBuilder taskMethodBuilder; //   private TaskAwaiter taskAwaiter; //  ,             ""  public int paramInt; private int localInt; private void MoveNext() { int num = currentState; try { TaskAwaiter awaiter5; TaskAwaiter awaiter4; TaskAwaiter awaiter3; TaskAwaiter awaiter2; TaskAwaiter awaiter; switch (num) { default: localInt = paramInt; //  await Console.WriteLine(1); //  await awaiter5 = Task.Delay(1000).GetAwaiter(); //  await if (!awaiter5.IsCompleted) //  await. ,    { num = (currentState = 0); // ,      taskAwaiter = awaiter5; //    ,        DelaysStateMachine stateMachine = this; //    taskMethodBuilder.AwaitUnsafeOnCompleted(ref awaiter5, ref stateMachine); //                 return; } goto Il_AfterFirstAwait; //  ,   ,    case 0: //            ,        .   ,          awaiter5 = taskAwaiter; //   taskAwaiter = default(TaskAwaiter); //   num = (currentState = -1); //  goto Il_AfterFirstAwait; //       case 1: //  ,      ,    ,     . awaiter4 = taskAwaiter; taskAwaiter = default(TaskAwaiter); num = (currentState = -1); goto Il_AfterSecondAwait; case 2: // ,     . awaiter3 = taskAwaiter; taskAwaiter = default(TaskAwaiter); num = (currentState = -1); goto Il_AfterThirdAwait; case 3: //    awaiter2 = taskAwaiter; taskAwaiter = default(TaskAwaiter); num = (currentState = -1); goto Il_AfterFourthAwait; case 4: //    { awaiter = taskAwaiter; taskAwaiter = default(TaskAwaiter); num = (currentState = -1); break; } Il_AfterFourthAwait: awaiter2.GetResult(); Console.WriteLine(5); //     awaiter = Task.Delay(1000).GetAwaiter(); //   if (!awaiter.IsCompleted) { num = (currentState = 4); taskAwaiter = awaiter; DelaysStateMachine stateMachine = this; taskMethodBuilder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine); return; } break; Il_AfterFirstAwait: //  ,        awaiter5.GetResult(); //       Console.WriteLine(2); //  ,     await awaiter4 = Task.Delay(1000).GetAwaiter(); //    if (!awaiter4.IsCompleted) { num = (currentState = 1); taskAwaiter = awaiter4; DelaysStateMachine stateMachine = this; taskMethodBuilder.AwaitUnsafeOnCompleted(ref awaiter4, ref stateMachine); return; } goto Il_AfterSecondAwait; Il_AfterThirdAwait: awaiter3.GetResult(); Console.WriteLine(4); //     awaiter2 = Task.Delay(1000).GetAwaiter(); //   if (!awaiter2.IsCompleted) { num = (currentState = 3); taskAwaiter = awaiter2; DelaysStateMachine stateMachine = this; taskMethodBuilder.AwaitUnsafeOnCompleted(ref awaiter2, ref stateMachine); return; } goto Il_AfterFourthAwait; Il_AfterSecondAwait: awaiter4.GetResult(); Console.WriteLine(3); //     awaiter3 = Task.Delay(1000).GetAwaiter(); //   if (!awaiter3.IsCompleted) { num = (currentState = 2); taskAwaiter = awaiter3; DelaysStateMachine stateMachine = this; taskMethodBuilder.AwaitUnsafeOnCompleted(ref awaiter3, ref stateMachine); return; } goto Il_AfterThirdAwait; } awaiter.GetResult(); } catch (Exception exception) { currentState = -2; taskMethodBuilder.SetException(exception); return; } currentState = -2; taskMethodBuilder.SetResult(); //    ,   ,       } void IAsyncStateMachine.MoveNext() {...} [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) {...} void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) {...} } 


рдореИрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ "рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред" рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рднреА рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдордХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐, рдпрд╛рдирд┐ рдХрд┐ рдереНрд░реЗрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, IsCompleted рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рдордп рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛ред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
 static async Task Main() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //1 Task task = Task.Delay(1000); Thread.Sleep(1700); await task; Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //1 } 


рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдорд╢реАрди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд AwaitUnsafeOnCompleted рд╡рд┐рдзрд┐ рдЕрдВрддрддрдГ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИред Task.SetContinuationForAwait рд╡рд┐рдзрд┐ред рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рдирдХреЛрдЯреЗрдХреНрд╕реНрдЯ.рдХреНрд░рд┐рдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреВрдЖрдИ рдереНрд░реЗрдб рдХрд╛ рд╕рдВрджрд░реНрдн), рддреЛ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди SynchronizationContextAwaitTaskContinuation class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рд░рдВрддрд░рддрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд░реНрдЧ рд╕рд╣реЗрдЬреЗ рдЧрдП рд╕рдВрджрд░реНрдн рдкрд░ рдкреЛрд╕реНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рд╕рдЯреАрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреЛрд╕реНрдЯ рд╡рд┐рдзрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдерд╛ (рдпрд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХрдиреНрдлрд┐рдЧрд░рдПрд╡рд┐рдЯ (рдЧрд▓рдд), рдЬрд┐рд╕реЗ рдЕрдВрддрд┐рдо рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рдкреВрд▓ рд╕реЗ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреА рдЙрддреНрдкрддреНрддрд┐ред рдбрд┐рд╡рд╛рдЗрд╕ рдорд╛рдирдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ


рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ async рдФрд░ рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рддрд░реАрдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рджреЗрдЦрд╛ рдерд╛, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреЛрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЙрдирдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдзрд┐рдХ рдЪрд╛рд▓рд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЦреБрдж рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╢рд╛рдпрдж рдПрдХ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рд╕рдордЭрдирд╛ рд╣реИред рдЬрдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рддреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ "рдЕрдм рд╕реНрдкрд╖реНрдЯ" рдФрд░ "рдЕрдм рдлрд┐рд░ рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ред" рдФрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рддрдм рддрдХ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд╕рдорд╛рди рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдПрдХ рдХрд╛рд░реНрдп рдХрдИ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдереНрд░реЗрдб рдХрдИ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

рддреЛ, рдЪрд▓реЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреА рдХреБрдЫ рдЬрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦреЗрдВред

  1. Task.Run, рдирдпрд╛ рдЯрд╛рд╕реНрдХ (..)ред рдкреНрд░рд╛рд░рдВрдн (), Factory.StartNew рдФрд░ рдкрд╕рдВрдж рдХрд░реЗрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрд╕ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреА рд╣реИрдВ, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИрдВред рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдкреВрд▓ рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╛рдкреНрдд рдХрд╛рд░реНрдп рдЬреЛ рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ (рд╕реАрдкреАрдпреВ-рдмрд╛рдЙрдВрдб) рдХреЛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. TaskCompletionSourceред рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдЬреЛ рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реНрдгрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ API рд╣реИ - SetResult, SetError, рдЖрджрд┐, рдЬреЛ рддрджрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдп рдЯрд╛рд╕реНрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╢рд╛рдпрдж рдЕрдВрджрд░ рдЖрдк рдзрд╛рдЧреЗ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗ, рдЙрдирдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд╣реИ рдпрд╛ рдШрдЯрдирд╛ рд╕реЗ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рдЖрдк рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рддрд░реАрдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рдкрдарди / рд▓реЗрдЦрди рдлрд╛рдЗрд▓реЗрдВ, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдФрд░ рдкрд╕рдВрдж рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдРрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдмреЗрд╣рдж рдордиреЛрд░рдВрдЬрдХ рд╣реЛрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдлрд╝рд╛рдЗрд▓реЗрдВ


рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ - рдпрджрд┐ рдЖрдк рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдлрд╛рдЗрд▓рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп = рд╕рд╣реА рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдм рдХреБрдЫ рдЧреИрд░-рддреБрдЪреНрдЫ рдФрд░ рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИред FileStream рд╡рд░реНрдЧ рдХреЛ рдЖрдВрд╢рд┐рдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ 6 рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдРрдб-рдСрди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдордирдорд╛рдирд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдПрдХреНрд╕реЗрд╕, рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИрдВ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХрд╛рдо рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рд╕ рд╕ рд╕ ред

рдпреВрдирд┐рдХреНрд╕

рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдСрдкрд░реЗрд╢рди рдХрд░рдирд╛ рд╣реИ, рдпрджрд┐ рдмрдлрд░ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░реАрдо рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдкрд░реЗрд╢рди рдореЗрдВ рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИ:

1. рд╕реНрдЯреНрд░реАрдо рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИ

рдлрд┐рд▓рд╛рд╕реНрдЯреНрд░реАрдо рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд╛рд╕ рд╕реЗрдореАрдлрд╝реЙрд░реНрдлрд╝рд╕рд┐рдорд▓ (1, 1) рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ - рдпрд╛рдиреА, рдПрдХ рд▓рд╛ рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди - рдЗрд╕ рд╕реЗрдорд╛рдлрд╝реЛрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдЦрдВрдб рдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рд╕рд╛рде рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрд░реНрдзрд╡реГрддреНрдд рдкрд░ рдЕрд╡рд░реЛрдз рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ ._asyncState.WaitAsync () рд╡рд┐рдзрд┐ рдЙрд╕ рдкрд░ рдХреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ (рдХреЛрдИ рд▓реЙрдХ рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдпрджрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЕрд░реНрдз-рднрд╛рдЧ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдирд┐рд░рдВрддрд░рддрд╛ (рдЯрд╛рд╕реНрдХ.рдХрдВрдЯреАрдиреНрдпреВрд╡рд┐рде) рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реМрдЯреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

2. рдмрдлрд░ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдкрд░реЗрд╢рди рдХреА рдкреНрд░рдХреГрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ + рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдХрдо рд╣реИ, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 4096 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ рд╢реБрд░реБрдЖрдд рд╕реЗ 4096 рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, 2048 рдмрд╛рдЗрдЯреНрд╕ 2048 рдХреА рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдирд┐рд░рдВрддрд░рддрд╛ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ (рдЯрд╛рд╕реНрдХред рдХреЙрдиреНрдЯреЗрдХреНрдЯрд╡реНрдпреВрде)ред рд╕реАрдХреНрд╡рд▓ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдмрдлрд╝рд░ рднрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ, рдлрд┐рд░ рд╕реЗ, рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ (рдЯрд╛рд╕реНрдХ.рдХрдВрдЯреАрдиреНрдпреВрд╡рд┐рде)ред

рд╡реИрд╕реЗ, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рд╣реИред рдпрджрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреВрд░реЗ рдмрдлрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛, рд╕реАрдзреЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред рдпрджрд┐ рдмрдлрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╣реИ рддреЛ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдмрдлрд░ рдХреЛ рдЕрдВрдд рддрдХ рднрд░реЗрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░реЗ рдХреЛ рдмрдлрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЗрд╕рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╕реАрдзреЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ 4097 рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рддреБрд░рдВрдд рдлрд╛рдЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд┐рдПред рдпрджрд┐ рд╣рдо 4095 рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╡рд┐рдВрдбреЛрдЬ

рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд, рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╕реАрдзреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╕реАрдзреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЙрд▓ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдордирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмреЛрд▓рдирд╛, рдРрд╕реА рдУрд╡рд░рд▓реИрдкреНрдб рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░ рд╣реИ - HANDLE hEventред рдпрд╣ рдПрдХ рдореИрдиреБрдЕрд▓ рд░реАрд╕реЗрдЯ рдШрдЯрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рддреА рд╣реИред рд╡рд╛рдкрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реАрдзреЗ рд▓рд┐рдЦрдирд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдмрдлрд░ рдХреЛ рд▓рд┐рдЦрдирд╛, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ FileStreamCompletionSource рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - TaskCompletionSource рдХрд╛ рдПрдХ рдЗрдирд╣реЗрд░реАрдЯрд░, рдЬрд┐рд╕рдореЗрдВ IOCallback рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдкреВрд▓ рд╕реЗ рдореБрдХреНрдд рдереНрд░реЗрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ рдореЗрдВ, рдУрд╡рд░рд▓реИрдкреНрдб рд╕рдВрд░рдЪрдирд╛ рдкрд╛рд░реНрд╕ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЬрд╛рджреВ рд╣реИред

рдиреЗрдЯрд╡рд░реНрдХ


рд╕реНрд░реЛрдд рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рджреЗрдЦрд╛, рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореЗрд░рд╛ рдкрде HttpClient рд╕реЗ рд╕реЙрдХреЗрдЯ рддрдХ рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯрдПрд╕реНрдХреНрдпреВрдСрдирдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рд▓реЗрдЯ рдЧрдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рд╣реА рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП, рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдУрд╡рд░рд▓реИрдкреНрдб рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдкрд░реЗрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреВрдирд┐рдХреНрд╕ рдкрд░, рдиреЗрдЯрд╡рд░реНрдХ рдСрдкрд░реЗрд╢рди рднреА рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

рдЕрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдИ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ async рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗред рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЖрд╡реЗрджрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ - рдореБрдЦреНрдп - рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдореЗрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 7 рдореЗрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реА рдЧрдИ рдереАред рд▓реЗрдХрд┐рди рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдмрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рдорд╛рдиреНрдп рдореЗрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реЗ рдмрд╕ рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдореЗрди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рддреЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕ рд╕рдордп, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрд╛рд╕реНрдХ, рдереНрд░реЗрдбрдкреВрд▓ рдпрд╛ рдереНрд░реЗрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╡рд╛рдм рдЖрд╕рд╛рди рд╣реИ - рдмреЗрд╢рдХ рдЯрд╛рд╕реНрдХред рдпрджрд┐ рдЖрдк TAP рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рдереНрд░реЗрдб рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВред рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП HttpClient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рдФрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ POST рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓реЗрдХрд░ рдЕрдВрдд рддрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрд╛ред , , .

TAP


Task.


Task . .

  1. Task.WhenAny(..) тАФ , IEnumerable/params , .
  2. Task.WhenAll(..) тАФ , IEnumerable/params ,
  3. Task.FromResult<T>(T value) тАФ , .
  4. Task.Delay(..) тАФ
  5. Task.Yield() тАФ . , . , ,

ConfigureAwait


, ┬л┬╗ . Task , , . , , Post. , , Post тАФ . , 1- , , , , UI, .ConfigureAwait(false) . , , .

. , .

- -, . , . - ASP.NET Core - ( , ). , Post .

TaskCompletionSource<T>


, Task. , , , . , TAP, , . :

рдЙрджрд╛рд╣рд░рдг
 public static Task<string> GetSomeDataAsync() { TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); FileSystemWatcher watcher = new FileSystemWatcher { Path = Directory.GetCurrentDirectory(), NotifyFilter = NotifyFilters.LastAccess, EnableRaisingEvents = true }; watcher.Changed += (o, e) => tcs.SetResult(e.FullPath); return tcs.Task; } 


, .

CancellationTokenSource


. TaskCompletionSource. var cts = new CancellationTokenSource() , , , IDisposable, cts.Token . , - , cts.Cancel() . .

CancellationToken . , , while, : cancellationToken.ThrowIfCancellationRequested() , OperationCanceledException ред рдпрд╣ рдЕрдкрд╡рд╛рдж рдСрдкрд░реЗрд╢рди рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рдЧрд╛рдИ рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рд╕рддреНрдп рд╣реЛ рдЬрд╛рдПрдЧреАред

LongRunning


, , , . , . ( ), . :

Task.Factory.StartNew(action, TaskCreationOptions.LongRunning )

Task.Factory.StartNew , .


рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдкреНрд░рд╢реНрди рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдпрд╣ рдПрдХ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрд╛рдПрдВ рдзрд╛рдЧреЗ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реИред ExceptionDispatchInfo рд╡рд░реНрдЧ рдХреЛ рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ ExceptionDispatchInfo.Capture (рдкреВрд░реНрд╡) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ ExceptionDispatchInfo рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред , Throw() . , await. , await void . , Post. . 100% . , Task Task<T>, void.

. TaskScheduler.UnobservedTaskException , , UnobservedTaskException . , GC , .

IAsyncEnumerable


C# 8 .NET Core 3.0 - (yield) , Task<IEnumerable<T>>, .. . . . IAsyncEnumerable<T> ( IAsyncEnumerator<T> ). foreach await. WithCancellation ConfigureAwait , CancelationToken .

, , .
, .

рдЙрджрд╛рд╣рд░рдг
 public class Program { public static async Task Main() { Stopwatch sw = new Stopwatch(); sw.Start(); IAsyncEnumerable<int> enumerable = AsyncYielding(); Console.WriteLine($"Time after calling: {sw.ElapsedMilliseconds}"); await foreach (var element in enumerable.WithCancellation(..).ConfigureAwait(false)) { Console.WriteLine($"element: {element}"); Console.WriteLine($"Time: {sw.ElapsedMilliseconds}"); } } static async IAsyncEnumerable<int> AsyncYielding() { foreach (var uselessElement in Enumerable.Range(1, 3)) { Task task = Task.Delay(TimeSpan.FromSeconds(uselessElement)); Console.WriteLine($"Task run: {uselessElement}"); await task; yield return uselessElement; } } } 


:

Time after calling: 0
Task run: 1
element: 1
Time: 1033
Task run: 2
element: 2
Time: 3034
Task run: 3
element: 3
Time: 6035


ThreadPool


TAP. . ThreadPool : + . , . , , , тАФ . , . , . тАФ . , , , . , . , , .

тАФ background- ( isBackground = true). , foreground- .

wait handle. , ( Windows).

Task-like


, ( ) . [AsyncMethodBuilder(..)] . await. тАФ , .

тАФ , . SetResult T task-like , T. .

 class MyTaskMethodBuilder<T> { public static MyTaskMethodBuilder<T> Create(); public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine; public void SetStateMachine(IAsyncStateMachine stateMachine); public void SetException(Exception exception); public void SetResult(T result); public void AwaitOnCompleted<TAwaiter, TStateMachine>( ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine; public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>( ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine; public MyTask<T> Task { get; } } 


Task-like . , .

. , , , . тАФ , SetStateMachine , . stateMachine.MoveNext Start , . Start , Task. .

, SetResult , SetException . await, GetAwaiter() task-like . ICriticalNotifyCompletion IsCompleted = false, builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine) . AwaitUnsafeOnCompleted awaiter.OnCompleted(action) , action stateMachine.MoveNext . INotifyCompletion builder.AwaitOnCompleted .

тАФ . 514 , . . - , , . , Main() ( - Microsoft). , -, .

-
 public class Program { public static void Main() { Console.WriteLine("Start"); JustMethod().Task.Wait(); //   Console.WriteLine("Stop"); } public static async LogTask JustMethod() { await DelayWrapper(1000); } public static LogTask DelayWrapper(int milliseconds) => new LogTask { Task = Task.Delay(milliseconds)}; } [AsyncMethodBuilder(typeof(LogMethodBuilder))] public class LogTask { public Task Task { get; set; } public TaskAwaiter GetAwaiter() => Task.GetAwaiter(); } public class LogMethodBuilder { private AsyncTaskMethodBuilder _methodBuilder = AsyncTaskMethodBuilder.Create(); private LogTask _task; public static LogMethodBuilder Create() { Console.WriteLine($"Method: Create; {DateTime.Now :O}"); return new LogMethodBuilder(); } public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { Console.WriteLine($"Method: Start; {DateTime.Now :O}"); _methodBuilder.Start(ref stateMachine); } public void SetStateMachine(IAsyncStateMachine stateMachine) { Console.WriteLine($"Method: SetStateMachine; {DateTime.Now :O}"); _methodBuilder.SetStateMachine(stateMachine); } public void SetException(Exception exception) { Console.WriteLine($"Method: SetException; {DateTime.Now :O}"); _methodBuilder.SetException(exception); } public void SetResult() { Console.WriteLine($"Method: SetResult; {DateTime.Now :O}"); _methodBuilder.SetResult(); } public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { Console.WriteLine($"Method: AwaitOnCompleted; {DateTime.Now :O}"); _methodBuilder.AwaitOnCompleted(ref awaiter, ref stateMachine); } public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { Console.WriteLine($"Method: AwaitUnsafeOnCompleted; {DateTime.Now :O}"); _methodBuilder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine); } public LogTask Task { get { Console.WriteLine($"Property: Task; {DateTime.Now :O}"); return _task ??= new LogTask {Task = _methodBuilder.Task}; } set => _task = value; } } 


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

рдкреНрд░рд╛рд░рдВрдн
рд╡рд┐рдзрд┐: рдмрдирд╛рдПрдБ; 2019-10-09T17: 55: 13.7152733 + 03: 00
рд╡рд┐рдзрд┐: рдкреНрд░рд╛рд░рдВрдн; 2019-10-09T17: 55: 13.7262226 + 03: 00
рд╡рд┐рдзрд┐: AwaitUnsafeOnCompleted; 2019-10-09T17: 55: 13.7275206 + 03: 00
рд╕рдВрдкрддреНрддрд┐: рдХрд╛рд░реНрдп; 2019-10-09T17: 55: 13.7292005 + 03: 00
рд╡рд┐рдзрд┐: SetResult; 2019-10-09T17: 55: 14.7297967 + 03: 00
рдмрдВрдж рдХрд░реЛ


, рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

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


All Articles