| | | 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 | | } |