Last active
September 12, 2017 12:39
-
-
Save fedemkr/d309eef9ff56a15845377c64ed9f9181 to your computer and use it in GitHub Desktop.
Wrapper to run a task with a custom timeout time and a cancellation token to be triggered if the time ends.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Threading; | |
using System.Threading.Tasks; | |
namespace MyNamespace | |
{ | |
public class TaskWithTimeoutWrapper | |
{ | |
protected volatile bool taskFinished = false; | |
public async Task<T> RunWithCustomTimeoutAsync<T>(int millisecondsToTimeout, Func<Task<T>> taskFunc, CancellationTokenSource cancellationTokenSource = null) | |
{ | |
this.taskFinished = false; | |
var results = await Task.WhenAll<T>(new List<Task<T>> | |
{ | |
this.RunTaskFuncWrappedAsync<T>(taskFunc), | |
this.DelayToTimeoutAsync<T>(millisecondsToTimeout, cancellationTokenSource) | |
}); | |
return results[0]; | |
} | |
public async Task RunWithCustomTimeoutAsync(int millisecondsToTimeout, Func<Task> taskFunc, CancellationTokenSource cancellationTokenSource = null) | |
{ | |
this.taskFinished = false; | |
await Task.WhenAll(new List<Task> | |
{ | |
this.RunTaskFuncWrappedAsync(taskFunc), | |
this.DelayToTimeoutAsync(millisecondsToTimeout, cancellationTokenSource) | |
}); | |
} | |
protected async Task DelayToTimeoutAsync(int millisecondsToTimeout, CancellationTokenSource cancellationTokenSource) | |
{ | |
await Task.Delay(millisecondsToTimeout); | |
this.ActionOnTimeout(cancellationTokenSource); | |
} | |
protected async Task<T> DelayToTimeoutAsync<T>(int millisecondsToTimeout, CancellationTokenSource cancellationTokenSource) | |
{ | |
await this.DelayToTimeoutAsync(millisecondsToTimeout, cancellationTokenSource); | |
return default(T); | |
} | |
protected virtual void ActionOnTimeout(CancellationTokenSource cancellationTokenSource) | |
{ | |
if (!this.taskFinished) | |
{ | |
cancellationTokenSource?.Cancel(); | |
throw new Exception(); | |
} | |
} | |
protected async Task RunTaskFuncWrappedAsync(Func<Task> taskFunc) | |
{ | |
await taskFunc.Invoke(); | |
this.taskFinished = true; | |
} | |
protected async Task<T> RunTaskFuncWrappedAsync<T>(Func<Task<T>> taskFunc) | |
{ | |
var result = await taskFunc.Invoke(); | |
this.taskFinished = true; | |
return result; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment