using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Esiur.Engine { public class AsyncQueue : AsyncReply { List> list = new List>(); //Action callback; object queueLock = new object(); public void Then(Action callback) { base.Then(new Action(o => callback((T)o))); } public void Add(AsyncReply reply) { lock (queueLock) list.Add(reply); resultReady = false; reply.Then(processQueue); } public void Remove(AsyncReply reply) { lock (queueLock) list.Remove(reply); processQueue(default(T)); } void processQueue(T o) { lock (queueLock) for (var i = 0; i < list.Count; i++) if (list[i].Ready) { Trigger(list[i].Result); list.RemoveAt(i); i--; } else break; resultReady = (list.Count == 0); } public AsyncQueue() { } } }