using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace AwInitilizer.Assist { public class SemaphoreQueue { private SemaphoreSlim semaphore; private ConcurrentQueue> queue = new ConcurrentQueue>(); public SemaphoreQueue(int initialCount) { semaphore = new SemaphoreSlim(initialCount); } public SemaphoreQueue(int initialCount, int maxCount) { semaphore = new SemaphoreSlim(initialCount, maxCount); } public void Wait() { WaitAsync().Wait(); } public Task WaitAsync() { var tcs = new TaskCompletionSource(); queue.Enqueue(tcs); semaphore.WaitAsync().ContinueWith(t => { TaskCompletionSource popped; if (queue.TryDequeue(out popped)) popped.SetResult(true); }); return tcs.Task; } public void Release() { semaphore.Release(); } } }