Task-based Asynchronous Pattern - WithTimeout

The same way we in CCR sometimes wanted to add a timeout to an existing "task" you probably want to do the same in TAP. So here are two extension methods you could use to add a timeout to any task of your choice:

  1: public async static Task WithTimeout(this Task task, TimeSpan timeout)
 2: {
 3:     var cancelationSource = new CancellationTokenSource();
 4:     var delay = Task.Delay(timeout, cancelationSource.Token);
 5:     await Task.WhenAny(task, delay);
 6:     if (task.IsCompleted)
 7:     {
 8:         cancelationSource.Cancel();
 9:     }
 10:     else
 11:     {
 12:         throw new TimeoutException();
 13:     }
 14: }
 15:         
 16: public async static Task<T> WithTimeout<T>(this Task<T> task, TimeSpan timeout)
 17: {
 18:     await ((Task)task).WithTimeout(timeout);
 19:     return await task;
 20: }