Skip to content

Instantly share code, notes, and snippets.

@ThatRendle
Created June 14, 2011 13:09
Show Gist options
  • Save ThatRendle/1024860 to your computer and use it in GitHub Desktop.
Save ThatRendle/1024860 to your computer and use it in GitHub Desktop.
DelayedStart extension for System.Threading.Tasks.Task
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
}
}
}
@ThatRendle
Copy link
Author

This is quite handy, so I've stuck it here for pasting in where it's needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment