|
30 | 30 | //---------------------------------------------------------------------------
|
31 | 31 |
|
32 | 32 | using System;
|
| 33 | +using System.Diagnostics.CodeAnalysis; |
33 | 34 | using System.Threading;
|
34 | 35 | using System.Threading.Tasks;
|
35 | 36 | using System.Threading.Tasks.Sources;
|
@@ -117,13 +118,38 @@ public void Reset()
|
117 | 118 | _valueTaskSource.Reset();
|
118 | 119 | }
|
119 | 120 |
|
120 |
| - void IValueTaskSource.GetResult(short token) => |
| 121 | + void IValueTaskSource.GetResult(short token) |
| 122 | + { |
| 123 | + if (token != _valueTaskSource.Version) |
| 124 | + { |
| 125 | + ThrowIncorrectTokenException(); |
| 126 | + } |
| 127 | + |
121 | 128 | _valueTaskSource.GetResult(token);
|
| 129 | + } |
| 130 | + |
| 131 | + ValueTaskSourceStatus IValueTaskSource.GetStatus(short token) |
| 132 | + { |
| 133 | + if (token != _valueTaskSource.Version) |
| 134 | + { |
| 135 | + ThrowIncorrectTokenException(); |
| 136 | + } |
| 137 | + |
| 138 | + return _valueTaskSource.GetStatus(token); |
| 139 | + } |
122 | 140 |
|
123 |
| - ValueTaskSourceStatus IValueTaskSource.GetStatus(short token) => |
124 |
| - _valueTaskSource.GetStatus(token); |
| 141 | + void IValueTaskSource.OnCompleted(Action<object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags) |
| 142 | + { |
| 143 | + if (token != _valueTaskSource.Version) |
| 144 | + { |
| 145 | + ThrowIncorrectTokenException(); |
| 146 | + } |
125 | 147 |
|
126 |
| - void IValueTaskSource.OnCompleted(Action<object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags) => |
127 | 148 | _valueTaskSource.OnCompleted(continuation, state, token, flags);
|
| 149 | + } |
| 150 | + |
| 151 | + [DoesNotReturn] |
| 152 | + static void ThrowIncorrectTokenException() => |
| 153 | + throw new InvalidOperationException("ValueTask cannot be awaited multiple times."); |
128 | 154 | }
|
129 | 155 | }
|
0 commit comments