@@ -11,13 +11,15 @@ public class AsyncManualResetEvent
11
11
{
12
12
private volatile TaskCompletionSource < bool > m_tcs = new TaskCompletionSource < bool > ( ) ;
13
13
14
- public Task WaitAsync ( CancellationToken cancellationToken = default )
14
+ public async Task WaitAsync ( CancellationToken cancellationToken = default )
15
15
{
16
16
var tcs = m_tcs ;
17
+ var cancelTcs = new TaskCompletionSource < bool > ( ) ;
18
+
17
19
cancellationToken . Register (
18
- s => ( ( TaskCompletionSource < bool > ) s ) . TrySetCanceled ( ) , tcs ) ;
20
+ s => ( ( TaskCompletionSource < bool > ) s ) . TrySetCanceled ( ) , cancelTcs ) ;
19
21
20
- return m_tcs . Task ;
22
+ await await Task . WhenAny ( tcs . Task , cancelTcs . Task ) ;
21
23
}
22
24
23
25
private async Task < bool > Delay ( int milliseconds )
@@ -26,15 +28,15 @@ private async Task<bool> Delay(int milliseconds)
26
28
return false ;
27
29
}
28
30
29
- public Task < bool > WaitAsync ( int milliseconds , CancellationToken cancellationToken = default )
31
+ public async Task < bool > WaitAsync ( int milliseconds , CancellationToken cancellationToken = default )
30
32
{
31
33
var tcs = m_tcs ;
34
+ var cancelTcs = new TaskCompletionSource < bool > ( ) ;
32
35
33
36
cancellationToken . Register (
34
- s => ( ( TaskCompletionSource < bool > ) s ) . TrySetCanceled ( ) , tcs ) ;
35
-
37
+ s => ( ( TaskCompletionSource < bool > ) s ) . TrySetCanceled ( ) , cancelTcs ) ;
36
38
37
- return Task . WhenAny ( m_tcs . Task , Delay ( milliseconds ) ) . Result ;
39
+ return await await Task . WhenAny ( m_tcs . Task , cancelTcs . Task , Delay ( milliseconds ) ) ;
38
40
}
39
41
40
42
public void Set ( )
@@ -43,6 +45,7 @@ public void Set()
43
45
Task . Factory . StartNew ( s => ( ( TaskCompletionSource < bool > ) s ) . TrySetResult ( true ) ,
44
46
tcs , CancellationToken . None , TaskCreationOptions . PreferFairness , TaskScheduler . Default ) ;
45
47
tcs . Task . Wait ( ) ;
48
+
46
49
}
47
50
48
51
public void Reset ( )
0 commit comments