ScpControl/Utilities/TaskQueue.cs (28 lines of code) (raw):

using System; using System.Threading.Tasks; namespace ScpControl.Utilities { /// <summary> /// A non-blocking event handling queue. /// </summary> /// <remarks>http://stackoverflow.com/a/32993768/490629</remarks> public class TaskQueue { private Task _previous = Task.FromResult(false); private readonly object _key = new object(); public Task<T> Enqueue<T>(Func<Task<T>> taskGenerator) { lock (_key) { var next = _previous.ContinueWith(t => taskGenerator()).Unwrap(); _previous = next; return next; } } public Task Enqueue(Func<Task> taskGenerator) { lock (_key) { var next = _previous.ContinueWith(t => taskGenerator()).Unwrap(); _previous = next; return next; } } } }