@@ -20,8 +20,13 @@ public static class TaskHelper
2020 /// <param name="task">Task to wait for.</param>
2121 /// <param name="milliseconds">Milliseconds timeout.</param>
2222 /// <param name="exceptionFactory">Optional timeout exception factory.</param>
23- public static Task WithTimeout ( this Task task , int milliseconds = 1_000 , Func < TimeSpan , Exception > exceptionFactory = null )
24- => WithTimeout ( task , TimeSpan . FromMilliseconds ( milliseconds ) , exceptionFactory ) ;
23+ /// <param name="cancellationToken">Cancellation token.</param>
24+ public static Task WithTimeout (
25+ this Task task ,
26+ int milliseconds = 1_000 ,
27+ Func < TimeSpan , Exception > exceptionFactory = null ,
28+ CancellationToken cancellationToken = default )
29+ => WithTimeout ( task , TimeSpan . FromMilliseconds ( milliseconds ) , exceptionFactory , cancellationToken ) ;
2530
2631 //Recipe from https://blogs.msdn.microsoft.com/pfxteam/2012/10/05/how-do-i-cancel-non-cancelable-async-operations/
2732 /// <summary>
@@ -31,10 +36,16 @@ public static Task WithTimeout(this Task task, int milliseconds = 1_000, Func<Ti
3136 /// <param name="task">Task to wait for.</param>
3237 /// <param name="timeout">The timeout period.</param>
3338 /// <param name="exceptionFactory">Optional timeout exception factory.</param>
34- public static Task WithTimeout ( this Task task , TimeSpan timeout , Func < TimeSpan , Exception > exceptionFactory = null )
39+ /// <param name="cancellationToken">Cancellation token.</param>
40+ public static Task WithTimeout (
41+ this Task task ,
42+ TimeSpan timeout ,
43+ Func < TimeSpan , Exception > exceptionFactory = null ,
44+ CancellationToken cancellationToken = default )
3545 => task . WithTimeout (
3646 ( ) => throw ( exceptionFactory ?? DefaultExceptionFactory ) ( timeout ) ,
37- timeout ) ;
47+ timeout ,
48+ cancellationToken ) ;
3849
3950 //Recipe from https://blogs.msdn.microsoft.com/pfxteam/2012/10/05/how-do-i-cancel-non-cancelable-async-operations/
4051 /// <summary>
@@ -44,8 +55,13 @@ public static Task WithTimeout(this Task task, TimeSpan timeout, Func<TimeSpan,
4455 /// <param name="task">Task to wait for.</param>
4556 /// <param name="timeoutAction">Action to be executed on Timeout.</param>
4657 /// <param name="milliseconds">Milliseconds timeout.</param>
47- public static Task WithTimeout ( this Task task , Func < Task > timeoutAction , int milliseconds = 1_000 )
48- => WithTimeout ( task , timeoutAction , TimeSpan . FromMilliseconds ( milliseconds ) ) ;
58+ /// <param name="cancellationToken">Cancellation token.</param>
59+ public static Task WithTimeout (
60+ this Task task ,
61+ Func < Task > timeoutAction ,
62+ int milliseconds = 1_000 ,
63+ CancellationToken cancellationToken = default )
64+ => WithTimeout ( task , timeoutAction , TimeSpan . FromMilliseconds ( milliseconds ) , cancellationToken ) ;
4965
5066 //Recipe from https://blogs.msdn.microsoft.com/pfxteam/2012/10/05/how-do-i-cancel-non-cancelable-async-operations/
5167 /// <summary>
@@ -55,9 +71,10 @@ public static Task WithTimeout(this Task task, Func<Task> timeoutAction, int mil
5571 /// <param name="task">Task to wait for.</param>
5672 /// <param name="timeoutAction">Action to be executed on Timeout.</param>
5773 /// <param name="timeout">The timeout period.</param>
58- public static async Task WithTimeout ( this Task task , Func < Task > timeoutAction , TimeSpan timeout )
74+ /// <param name="cancellationToken">Cancellation token.</param>
75+ public static async Task WithTimeout ( this Task task , Func < Task > timeoutAction , TimeSpan timeout , CancellationToken cancellationToken )
5976 {
60- if ( await TimeoutTask ( task , timeout ) . ConfigureAwait ( false ) )
77+ if ( await TimeoutTask ( task , timeout ) . ConfigureAwait ( false ) && ! cancellationToken . IsCancellationRequested )
6178 {
6279 await timeoutAction ( ) . ConfigureAwait ( false ) ;
6380 }
0 commit comments