123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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<TaskCompletionSource<bool>> queue =
- new ConcurrentQueue<TaskCompletionSource<bool>>();
- 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<bool>();
- queue.Enqueue(tcs);
- semaphore.WaitAsync().ContinueWith(t =>
- {
- TaskCompletionSource<bool> popped;
- if (queue.TryDequeue(out popped))
- popped.SetResult(true);
- });
- return tcs.Task;
- }
- public void Release()
- {
- semaphore.Release();
- }
- }
- }
|