.NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЙрди 45% рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдЬреЛ рдЕрднреА рднреА 2.0-3.5 рдЪреМрдЦрдЯреЗ рдкрд░ рдмреИрдареЗ рд╣реИрдВредрдЬреА рд╣рд╛рдВ, рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛ред async рдФрд░ рджреВрд╕рд░реЗ рд╕рдмрдиреЗрдЯ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗред
рдХреНрдпреЛрдВ?
рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд░рд╣рд╛ рдерд╛ред Async / awat рдмрд╣реБрдд рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рднрд╛рд╖рд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, Microsoft рдЙрдиреНрд╣реЗрдВ рдврд╛рдБрдЪреЗ рд╕реЗ рдХрд╕рдХрд░ рдирд╣реАрдВ рдмрд╛рдБрдзрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк Systemред Async CTP, 2010 рдХреЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдПред .NET 4.0 рдХреЛ рд▓рдХреНрд╖реНрдп рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рд░рд╛рд╕реНрддрд╛
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдФрд░ рдпрд╣рд╛рдВ рдореЛрдиреЛ рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдмреАрд╕реАрдПрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЦреИрд░, рдмреЗрд╢рд░реНрдореА рд╕реЗ
рдореЛрдиреЛ 3.10.1 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗред System.Threading.Tasks рдФрд░ System.untime.CompilerServices рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВред рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡реЗ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдирдХрд▓ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
1) OperationCanceledException рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдСрдкрд░реЗрдВрд╕реНрдбрд▓реА рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди рдмрдирд╛рдПрдБ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реЛред рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИред Token.ThrowIfCancelled, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
2) ExceptionDispatchInfoред рдпрд╣реАрдВ рд╕реЗ рдЕрд╕рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рдЦреЛрдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЛрдиреЛ рдЗрд╕реЗ рдЕрдкрд╡рд╛рдж рд╡рд░реНрдЧ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпреЗ рд╕реНрд░реЛрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЦреИрд░, рд╣рдо рдврд╛рдВрдЪреЗ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЪрдврд╝рддреЗ рд╣реИрдВред рдПрдХ рддреНрд╡рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрдореЛрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХрд░реЗрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрдВрддреНрд░ рд╣реИред
рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ (рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб / MethodInfo рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рд░рд╛рдЬреНрдп рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ):
public void Throw () { try { throw _exception; } catch { InternalPreserveStackTrace.Invoke (_exception, new object[0]); RemoteStackTrace.SetValue (_exception, _stackTrace); Source.SetValue (_exception, _source); throw; } }
рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рдХрд░реАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ:
рдЕрдкрд╡рд╛рдж рдХреЛ рдРрд╕реЗ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ рдорд╛рдиреЛ рд╡рд╣ рдЙрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдмрд╣ рдЧрдпрд╛ рд╣реЛ рдЬрд╣рд╛рдВ рдЙрд╕реЗ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд╣рд╛рдВ рдереНрд░реЛ рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИред
рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рд╣рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ ... рд╣рдо рдЪрд┐рддреНрд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ: async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдп, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЧреБрдгреЛрдВ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдХреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП
рдПрд╕рдпреВрдПрдирд╕реА рд╕реАрдЯреАрдкреА рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдорд╡реАрд╕реА 3 рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣рдЯрд╛рдиреЗ рдФрд░ SP1 рдХреЗ рдмрд╛рдж рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ
рд╕рднреА рдЕрдкрдбреЗрдЯред
рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2012 рдореЗрдВ, рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдмрд╛рдж,
MonoLib.dll рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдореЗрдВ C # 5 рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рд╣реИред
рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рд╕реБрдзрд╛рд░
рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрдкрд▓ рдФрд░ рдПрдХреНрд╢рди / рдлрдВрдХ рдУрд╡рд░рд▓реЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд╛рдЗрдирдХреНрдпреВ 2 рдУрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдЯрдлрд┐рдВрдЧ рдФрд░ рд╕реНрдЯрдлрд┐рдВрдЧ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
MonoLib.Async.Extension рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реА рдЧрдИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЖрдзреЗ рдХреЛ
рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реИрд╕реЗ, рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд▓рдкреЗрдЯреЗрдВред
MonoLib.dll рд╕реНрд░реЛрдд (рдореЛрдиреЛ + рд╕рдВрдкрд╛рджрди + рдЕрдкрд╡рд╛рджDispatchInfo рд╕реЗ рдЙрдзрд╛рд░)
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЖрдк рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред