1
+ #if NETFRAMEWORK || NETSTANDARD || NETCOREAPP || NET5_0
2
+
3
+ #pragma warning disable
4
+
5
+ // ReSharper disable RedundantUsingDirective
6
+ // ReSharper disable PartialTypeWithSinglePart
7
+ // ReSharper disable UnusedMember.Global
8
+ // ReSharper disable RedundantAttributeSuffix
9
+
10
+ using System ;
11
+ using System . Reflection ;
12
+ using System . Threading ;
13
+ using System . Threading . Tasks ;
14
+ using DescriptionAttribute = System . ComponentModel . DescriptionAttribute ;
15
+
16
+ static partial class PolyfillExtensions
17
+ {
18
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-threading-cancellationtoken)" ) ]
19
+ public static Task WaitAsync ( this Task task , CancellationToken cancellationToken ) =>
20
+ task . WaitAsync ( Timeout . InfiniteTimeSpan , cancellationToken ) ;
21
+
22
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-timespan)" ) ]
23
+ public static async Task WaitAsync ( this Task task , TimeSpan timeout )
24
+ {
25
+ var cancellationSource = new CancellationTokenSource ( ) ;
26
+ try
27
+ {
28
+ await task . WaitAsync ( timeout , cancellationSource . Token ) ;
29
+ }
30
+ finally
31
+ {
32
+ cancellationSource . Cancel ( ) ;
33
+ cancellationSource . Dispose ( ) ;
34
+ }
35
+ }
36
+
37
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-timespan-system-threading-cancellationtoken)" ) ]
38
+ public static async Task WaitAsync ( this Task task , TimeSpan timeout , CancellationToken cancellationToken )
39
+ {
40
+ var delayTask = Task . Delay ( timeout , cancellationToken ) ;
41
+ var completedTask = await Task . WhenAny ( task , delayTask ) ;
42
+ if ( completedTask == delayTask )
43
+ {
44
+ throw new TimeoutException ( $ "Execution did not complete within the time allotted { timeout . TotalMilliseconds } ms") ;
45
+ }
46
+
47
+ await task ;
48
+ }
49
+
50
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-threading-cancellationtoken)" ) ]
51
+ public static Task < TResult > WaitAsync < TResult > ( this Task < TResult > task , CancellationToken cancellationToken ) =>
52
+ task . WaitAsync < TResult > ( Timeout . InfiniteTimeSpan , cancellationToken ) ;
53
+
54
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.waitasync#system-threading-tasks-task-1-waitasync(system-threading-cancellationtoken)" ) ]
55
+ public static async Task < TResult > WaitAsync < TResult > ( this Task < TResult > task , TimeSpan timeout )
56
+ {
57
+ var cancellationSource = new CancellationTokenSource ( ) ;
58
+ try
59
+ {
60
+ return await task . WaitAsync ( timeout , cancellationSource . Token ) ;
61
+ }
62
+ finally
63
+ {
64
+ cancellationSource . Cancel ( ) ;
65
+ cancellationSource . Dispose ( ) ;
66
+ }
67
+ }
68
+
69
+ [ DescriptionAttribute ( "https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.waitasync#system-threading-tasks-task-1-waitasync(system-timespan-system-threading-cancellationtoken)" ) ]
70
+ public static async Task < TResult > WaitAsync < TResult > ( this Task < TResult > task , TimeSpan timeout , CancellationToken cancellationToken )
71
+ {
72
+ var delayTask = Task . Delay ( timeout , cancellationToken ) ;
73
+ var completedTask = await Task . WhenAny ( task , delayTask ) ;
74
+ if ( completedTask == delayTask )
75
+ {
76
+ throw new TimeoutException ( $ "Execution did not complete within the time allotted { timeout . TotalMilliseconds } ms") ;
77
+ }
78
+
79
+ return await task ;
80
+ }
81
+ }
82
+
83
+ #endif
0 commit comments