@@ -184,18 +184,14 @@ public async Task<TResult> ExecuteAsync<TResult>(Func<CancellationToken, Task<TR
184184 ArgumentNullException . ThrowIfNull ( worker ) ;
185185
186186 var exception = default ( Exception ? ) ;
187- var leaseToken = Token ;
188- var operationToken = token ;
189- var cts = operationToken . LinkTo ( leaseToken ) ;
190-
191- var task = Fork ( worker , operationToken ) ;
187+ var task = Fork ( worker , out var cts , out var leaseToken , token ) ;
188+ var timerToken = task . AsCancellationToken ( ) ;
192189 try
193190 {
194- Task completedTask ;
195191 do
196192 {
197- completedTask = await Task . WhenAny ( Task . Delay ( Expiration . Value / 2 , operationToken ) , task ) . ConfigureAwait ( false ) ;
198- } while ( ! ReferenceEquals ( completedTask , task ) && await TryRenewAsync ( token ) . ConfigureAwait ( false ) ) ;
193+ await Task . Delay ( Expiration . Value / 2 , timerToken ) . ConfigureAwait ( ConfigureAwaitOptions . SuppressThrowing ) ;
194+ } while ( ! task . IsCompleted && await TryRenewAsync ( token ) . ConfigureAwait ( false ) ) ;
199195 }
200196 catch ( Exception e )
201197 {
@@ -222,6 +218,14 @@ public async Task<TResult> ExecuteAsync<TResult>(Func<CancellationToken, Task<TR
222218 {
223219 cts ? . Dispose ( ) ;
224220 }
221+ }
222+
223+ private Task < TResult > Fork < TResult > ( Func < CancellationToken , Task < TResult > > worker , out LinkedCancellationTokenSource ? cts ,
224+ out CancellationToken leaseToken ,
225+ CancellationToken token )
226+ {
227+ cts = token . LinkTo ( leaseToken = Token ) ;
228+ return Fork ( worker , token ) ;
225229
226230 static Task < TResult > Fork ( Func < CancellationToken , Task < TResult > > function , CancellationToken token )
227231 => Task . Run ( ( ) => function ( token ) , token ) ;
0 commit comments