.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде
рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓
рд▓рд╛рдЗрдмреНрд░реЗрд░реА (TPL), рдЬреЛ рдХрд╛рд░реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдирддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ,
BCL рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп
Task
рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░
Task
рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ
ред рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг рд╣реИрдВ; рд╡реЗ рдЖрдкрдХреЛ рдРрд╕реЗ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рд╕рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдзрд╛рдЧреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╣рдХрд╛рд░реА рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ:
рд░рджреНрджреАрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ TPL рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИ - CancellationToken
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреЛ CancellationToken
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, OperationCanceledException
рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣, рд╕реВрдХреНрд╖реНрдорддрд╛, рдЪрд╛рд▓ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╣реИрдВред
рд╕рд╣-рдСрдк рд░рджреНрджреАрдХрд░рдг рдХреНрдпреЛрдВ рд╣реИ?
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ (рдкрд░рддреЛрдВ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХреЛрдб "рдЖрд╕-рдкрд╛рд╕" рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди, рдмрд╛рд╣рд░реА рдкрд░рддред рдпрд╣ рдХреЛрдб рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдХреЛрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди, рдЖрдВрддрд░рд┐рдХ рдкрд░рдд "рдЕрдВрджрд░" рд╣реИред рдпрд╣ рдХреЛрдб рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдкреЗрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ - рдЧрдгрдирд╛, рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ, рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЖрджрд┐ред
- рдмрд╛рд╣рд░реА (1) рдФрд░ рдЖрдВрддрд░рд┐рдХ (2) рдХреЛрдб, рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреА рдкрд░рдд рдХреЗ рдмреАрдЪ рдордзреНрдпрд╕реНрде рдХреЛрдбред рд╡рд╣ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рд╡рд╣ рд╡рд╛рдВрдЫрд┐рдд рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдмрд╛рд╣рд░реА рдХреЛрдб, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реЛред рдЯреАрдкреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЛрдб рдЯреАрдкреАрдПрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реА рд╣реИред
рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рджреНрджреАрдХрд░рдг рддрдВрддреНрд░ рд╕рд╣рдХрд╛рд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рддреАрди рдкрд░рддреЛрдВ рд╕реЗ рд░рджреНрджреАрдХрд░рдг рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рд┐рдд рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдЬреЛ рд░рджреНрджреАрдХрд░рдг рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
CancellationTokenSource cts; void Start() { cts = new CancellationTokenSource();
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
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
), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЛрдб рдХреЛ рдПрдХ
OperationCanceledException
рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдПрдХ CancellationToken
рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред - рдХрд╛рд░реНрдп
CancellationToken
рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА CancellationToken
рдХреЛ рдкрд╛рд╕ CancellationToken
рдЪрд╛рд╣рд┐рдПред CancellationToken
рдХрд╛ IsCancellationRequested
рд╕рдВрдкрддреНрддрд┐ CancellationToken
рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token;
рдпрд╣рд╛рдВ,
CancellationToken
OperationCanceledException
рдХреИрдиреНрд╕реЗрд▓рдбреЗрдб
OperationCanceledException
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ
OperationCanceledException
рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп
CancellationToken.ThrowIfCancelationRequested
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ
CancellationToken.ThrowIfCancelationRequested
рдмреЗрд╣рддрд░ рд╣реИред
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token;
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╕рдордп,
Task.Run
рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛
Task.Run
ред рд╡рд┐рдзрд┐ред
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var cts2 = new CancellationTokenSource(); var cancellationToken2 = cts2.Token;
рдпрд╣рд╛рдБ, рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CancellationToken
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CancellationToken
рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрд▓рдЧ-рдЕрд▓рдЧ
CancellationTokenSource
рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token;
рдПрдХ
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!"));
рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдХрд╛рд░реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдЙрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
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);
рд▓реЗрдХрд┐рди рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддрдм рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм
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);
рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ
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);
рд░рджреНрдж рдХрд░реЗрдВ рдФрд░ 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); }
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); }