Created
June 14, 2011 13:09
-
-
Save ThatRendle/1024860 to your computer and use it in GitHub Desktop.
DelayedStart extension for System.Threading.Tasks.Task
This file contains hidden or 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
public static class TaskEx | |
{ | |
private static readonly ConcurrentDictionary<Task, Timer> Timers = new ConcurrentDictionary<Task, Timer>(); | |
public static Task DelayedStart(this Task task, TimeSpan delay) | |
{ | |
var timer = new Timer(_ => Start(task), null, (long)delay.TotalMilliseconds, -1L); | |
Timers.AddOrUpdate(task, timer, (k, t) => t); | |
return task; | |
} | |
public static Task DelayedStart(Action action, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action), delay); | |
} | |
public static Task DelayedStart(Action action, CancellationToken cancellationToken, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, cancellationToken), delay); | |
} | |
public static Task DelayedStart(Action action, CancellationToken cancellationToken, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, cancellationToken, taskCreationOptions), delay); | |
} | |
public static Task DelayedStart(Action action, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, taskCreationOptions), delay); | |
} | |
public static Task DelayedStart(Action<object> action, object state, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, state), delay); | |
} | |
public static Task DelayedStart(Action<object> action, object state, CancellationToken cancellationToken, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, state, cancellationToken), delay); | |
} | |
public static Task DelayedStart(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, state, cancellationToken, taskCreationOptions), delay); | |
} | |
public static Task DelayedStart(Action<object> action, object state, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task(action, state, taskCreationOptions), delay); | |
} | |
public static Task<T> DelayedStart<T>(this Task<T> task, TimeSpan delay) | |
{ | |
var timer = new Timer(_ => Start(task), null, (long)delay.TotalMilliseconds, -1L); | |
Timers.AddOrUpdate(task, timer, (k, t) => timer); | |
return task; | |
} | |
public static Task<T> DelayedStart<T>(Func<T> func, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<T> func, CancellationToken cancellationToken, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, cancellationToken), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<T> func, CancellationToken cancellationToken, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, cancellationToken, taskCreationOptions), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<T> func, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, taskCreationOptions), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<object, T> func, object state, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, state), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<object, T> func, object state, CancellationToken cancellationToken, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, state, cancellationToken), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<object, T> func, object state, CancellationToken cancellationToken, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, state, cancellationToken, taskCreationOptions), delay); | |
} | |
public static Task<T> DelayedStart<T>(Func<object, T> func, object state, TaskCreationOptions taskCreationOptions, TimeSpan delay) | |
{ | |
return DelayedStart(new Task<T>(func, state, taskCreationOptions), delay); | |
} | |
private static void Start(Task task) | |
{ | |
task.Start(); | |
Timer timer; | |
if (!Timers.TryRemove(task, out timer)) return; | |
using (timer) | |
{ | |
// Just disposing | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is quite handy, so I've stuck it here for pasting in where it's needed.