| | 1 | | // Copyright (c) ZeroC, Inc. |
| | 2 | |
|
| | 3 | | namespace IceRpc.Internal; |
| | 4 | |
|
| | 5 | | internal static class TaskExtensions |
| | 6 | | { |
| | 7 | | /// <summary>Converts this task into a linked cancellation token.</summary> |
| | 8 | | /// <param name="task">The task that upon completion cancels the linked token.</param> |
| | 9 | | /// <param name="token">The source token.</param> |
| | 10 | | /// <returns>A cancellation token that is canceled when <paramref name="task" /> completes or |
| | 11 | | /// <paramref name="token" /> is canceled.</returns> |
| | 12 | | internal static CancellationToken AsCancellationToken(this Task task, CancellationToken token) |
| 802 | 13 | | { |
| 802 | 14 | | var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(token); |
| | 15 | |
|
| 802 | 16 | | CancellationToken linkedToken = linkedCts.Token; |
| 802 | 17 | | _ = CancelOnCompleteAsync(); |
| 802 | 18 | | return linkedToken; |
| | 19 | |
|
| | 20 | | async Task CancelOnCompleteAsync() |
| 802 | 21 | | { |
| 802 | 22 | | using CancellationTokenSource cts = linkedCts; // takes ownership of linkedCts |
| | 23 | | try |
| 802 | 24 | | { |
| 802 | 25 | | await task.ConfigureAwait(false); |
| 800 | 26 | | } |
| 0 | 27 | | catch |
| 0 | 28 | | { |
| | 29 | | // It's ok for task to complete with an exception. |
| 0 | 30 | | } |
| 800 | 31 | | cts.Cancel(); |
| 800 | 32 | | } |
| 802 | 33 | | } |
| | 34 | | } |