рдХрд╛рд░реНрдп рдФрд░ рдкреВрд░реНрд╡рд╡рдд .Net рдореЗрдВ - рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ

.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (TPL), рдЬреЛ рдХрд╛рд░реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдирддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, BCL рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп Task рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ Task рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ ред рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг рд╣реИрдВ; рд╡реЗ рдЖрдкрдХреЛ рдРрд╕реЗ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рд╕рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдзрд╛рдЧреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред

.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╣рдХрд╛рд░реА рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ:

рд░рджреНрджреАрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ TPL рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИ - CancellationToken рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреЛ CancellationToken рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, OperationCanceledException рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣, рд╕реВрдХреНрд╖реНрдорддрд╛, рдЪрд╛рд▓ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╣реИрдВред

рд╕рд╣-рдСрдк рд░рджреНрджреАрдХрд░рдг рдХреНрдпреЛрдВ рд╣реИ?


рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ (рдкрд░рддреЛрдВ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ рд╕рд╣рдХрд╛рд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рддреАрди рдкрд░рддреЛрдВ рд╕реЗ рд░рджреНрджреАрдХрд░рдг рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рд┐рдд рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдЬреЛ рд░рджреНрджреАрдХрд░рдг рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 CancellationTokenSource cts; void Start() { cts = new CancellationTokenSource(); //    var task = Task.Run(() => SomeWork(cts.Token), cts.Token); //     // // ... } int SomeWork(CancellationToken cancellationToken) { int result; while (true) { // -  ... // ...   ,      cancellationToken.ThrowIfCancellationRequested(); } //   return result; } void Cancel() { //    cts.Cancel(); } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, Start рдФрд░ Cancel рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдмрд╛рд╣рд░реА рдкрд░рдд рд╣реИред рдпрд╣ Task.Run рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпрд╣ рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ SomeWork рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ: рдЖрдВрддрд░рд┐рдХ рдкрд░рдд рд╕реАрдзреЗ рдСрдкрд░реЗрд╢рди ( SomeWork рдкрджреНрдзрддрд┐) рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреА рдкрд░рдд (рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рддрд░реНрдХ Task.Run рдлрд╝рдВрдХреНрд╢рди) рдкрд░ред Cancel рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрд╢рди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред

рдкреЗрд▓реЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдВрддрд░рд┐рдХ рдкрд░рдд ( SomeWork рдлрд╝рдВрдХреНрд╢рди) рд╕рдордп-рд╕рдордп рдкрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреИрдВрд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ OperationCanceledException рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рдХрд┐ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


CancellationTokenSource.Cancel рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдпрд╛ CancellationTokenSource.Cancel рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЛ CancellationTokenSource рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ / CancellationTokenSource.CancelAfter рд╡рд┐рдзрд┐) рдХреЗ рд░реВрдк рдореЗрдВ CancellationTokenSource рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд░рджреНрдж рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рджреНрдж рдХрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдареАрдХ рдПрдХ рдмрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдорди рдХреЛ рдмрджрд▓рдирд╛ рдФрд░ CancellationTokenSource рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ CancellationTokenSource рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрдж CancellationTokenSource рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХреА рдЕрдирджреЗрдЦреА рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рд░рджреНрдж рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реЛрдиреЗ рдкрд░, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ CancellationToken.Register рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, CancellationToken.ThrowIfCancellationRequested рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЖрдВрддрд░рд┐рдХ рдкрд░рдд рдХреЛрдб рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдорддреМрд░ рдкрд░, рд╕рддреНрдпрд╛рдкрди рдХреЛрдб ThrowIfCancellationRequested рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ, рдЕрдЧрд░ рдСрдкрд░реЗрд╢рди рддреБрд░рдВрдд рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ IsCancellationRequested рд╕реЗ рдкрд╣рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ), рд╕рддреНрдпрд╛рдкрди рдХреЛрдб IsCancellationRequested рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ true , рддреЛ рд╕рдВрд╕рд╛рдзрди рд╕рд╛рдл тАЛтАЛрд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ ThrowIfCancellationRequested OperationCanceledException рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ, ThrowIfCancellationRequested рд╡рд┐рдзрд┐ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдСрдкрд░реЗрд╢рди рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдСрдкрд░реЗрд╢рди рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдЬрдм рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдпрд╛ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде), рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ( Task.IsCompleted == true ), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд░рджреНрдж рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ ( Task.IsCanceled == false )ред

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

рддреАрд╕рд░рд╛, CancellationToken рдкрд╛рд╕ CanBeCanceled рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрджрд┐ рдпрд╣ false , рддреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред CanBeCanceled false рдпрджрд┐ CancellationToken рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реНрдереИрддрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ CancellationToken , рддреЛ CancellationToken ред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЪреМрдерд╛, рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" (async рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ) рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рдП (рддрд╛рдХрд┐ Task.IsCanceled рд╕рдВрдкрддреНрддрд┐ true ), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... Task.Run(() => { //... if (cancellationToken.IsCancellationRequested) throw new OperationCanceledException(); //   CancellationToken //... }, cancellationToken); 

рдпрд╣рд╛рдВ, CancellationToken OperationCanceledException рдХреИрдиреНрд╕реЗрд▓рдбреЗрдб OperationCanceledException рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ OperationCanceledException рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп CancellationToken.ThrowIfCancelationRequested рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ CancellationToken.ThrowIfCancelationRequested рдмреЗрд╣рддрд░ рд╣реИред

 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... Task.Run(() => { //... cancellationToken.ThrowIfCancellationRequested(); //... }/*   CancellationToken */); 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╕рдордп, Task.Run рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ Task.Run ред рд╡рд┐рдзрд┐ред

 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var cts2 = new CancellationTokenSource(); var cancellationToken2 = cts2.Token; //... var task = Task.Run(() => { //... cancellationToken2.ThrowIfCancellationRequested(); // ┬л┬╗ CancellationToken //... }, cancellationToken); 

рдпрд╣рд╛рдБ, рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, CancellationToken рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, CancellationToken рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрд▓рдЧ-рдЕрд▓рдЧ CancellationTokenSource рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... var task = Task.Run(() => { //... if (!cancellationToken.IsCancellationRequested) //    throw new OperationCanceledException(cancellationToken); //... }, cancellationToken); 

рдПрдХ OperationCanceledException , рд╣рд╛рд▓рд╛рдБрдХрд┐ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, OperationCanceledException рдХреЛ TPL рдХреЗ рдЕрдВрджрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВред рдирддреАрдЬрддрди, рдХрд╛рд░реНрдп рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ ( Task.IsCancelled == false , Task.IsFaulted == true )ред

рд░рджреНрдж рдХрд░реЗрдВ рдФрд░ рдирд┐рд░рдВрддрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВ


TPL рдЖрдкрдХреЛ рдУрд╡рд░рд▓реЛрдб рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Task.ContinueWith рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рдеред рдЯрд╛рд╕реНрдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпред Task.ContinueWith рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕ рдХрд╛рд░реНрдп рдХреЛ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рд╣реИред рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
 var antecedentTask = Task.Run(() => Console.Write("Hello, ")); var continuationTask = antecedentTask.ContinueWith(_ => Console.Write("world!")); //    `Hello, world!` 

рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдХрд╛рд░реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдЙрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред Task.ContinueWith рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде CancellationToken рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдпрджрд┐ рдирд┐рд░рд╕реНрддреАрдХрд░рдг рдЕрдиреБрд░реЛрдз рддрдм рдЖрддрд╛ рд╣реИ рдЬрдм рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рдЕрднреА рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рддреБрд░рдВрдд рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var antecedentTask = Task.Run(() => Thread.Sleep(5000)); var continuationTask = antecedentTask.ContinueWith( _ => {}, cancellationToken); Thread.Sleep(1000); cts.Cancel(); Console.WriteLine(antecedentTask.IsCompleted); // False Console.WriteLine(continuationTask.IsCompleted); // True 

рд▓реЗрдХрд┐рди рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддрдм рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм TaskContinuationOptions.LazyCancellation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рдмрдирд╛ рд░рд╣рд╛ рд╣реЛред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛):
 var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var antecedentTask = Task.Run(() => Thread.Sleep(5000)); var continuationTask = antecedentTask.ContinueWith( _ => {}, cancellationToken, TaskContinuationOptions.LazyCancellation, TaskScheduler.Default); Thread.Sleep(1000); cts.Cancel(); Console.WriteLine(antecedentTask.IsCompleted); // False Console.WriteLine(continuationTask.IsCompleted); // False 

рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ CancellationToken рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рд░рджреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред TaskContinuationOptions рдореЗрдВ рдЭрдВрдбреЗ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЬрдм рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ / рдирд┐рд░рд╕реНрддреАрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░рдВрддрд░ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 var antecedentTask = Task.Run(() => {}); var continuationTask1 = antecedentTask.ContinueWith( _ => {}, TaskContinuationOptions.OnlyOnRanToCompletion); var continuationTask2 = antecedentTask.ContinueWith( _ => {}, TaskContinuationOptions.NotOnRanToCompletion); try { Task.WaitAll(continuationTask1, continuationTask2); } catch{} Console.WriteLine(continuationTask1.IsCanceled); // False Console.WriteLine(continuationTask2.IsCanceled); // True 

рд░рджреНрдж рдХрд░реЗрдВ рдФрд░ async рд╡рд┐рдзрд┐рдпрд╛рдБ


C # 5.0 рдиреЗ async рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХреАред рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, async рд╡рд┐рдзрд┐рдпрд╛рдБ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ void рдФрд░ Task / Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }

Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }

Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
Task. , async- (Task / Task), , . ,
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }
 Task.   ,  async-   (Task / Task),    ,   . ,   
Task<int> task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // - } return 42; });

async- :
Task<int> task = SomeWork(); async Task<int> SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // - } return 42; }
, Task.Run , Task.Factory.StartNew , . SomeWork int . , SomeWork Task.

, async-, , , . , :
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);


var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task<int> task = SomeWork(cancellationToken); async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // - cancellationToken.ThrowIfCancellationRequested(); } return 42; }
, async-, , CancellationToken ( CancellationToken async- CancellationToken ). :
async-, async- . (, Task.Run Task.ContinueWith ) . 1 2. , async-, . OperationCanceledException . CancellationToken , , .. . , , CancellationToken . , Task.Run , :
static async Task<int> SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Task.IsCompleted true . ( Task.Status == TaskStatus.RanToCompletion ), ( Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true ) ( Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true ). .

-. TaskContinuationOptions - -:
var task = Task.Run(() => 42); task.ContinueWith( t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith( _ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith( t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Task.Wait Task.Result. c , . . -, тАФ AggregateException . AggregateException , ( AggregateException ). -, , , AggregateException TaskCanceledException , OperationCanceledException , :
var task = Task.Run(() => { /* - */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
async- await . AggregateException , OperationCanceledException ; :
var task = Task.Run(() => { /* - */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }

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


All Articles