SemaphoreQueue.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace AwInitilizer.Assist
  9. {
  10. public class SemaphoreQueue
  11. {
  12. private SemaphoreSlim semaphore;
  13. private ConcurrentQueue<TaskCompletionSource<bool>> queue =
  14. new ConcurrentQueue<TaskCompletionSource<bool>>();
  15. public SemaphoreQueue(int initialCount)
  16. {
  17. semaphore = new SemaphoreSlim(initialCount);
  18. }
  19. public SemaphoreQueue(int initialCount, int maxCount)
  20. {
  21. semaphore = new SemaphoreSlim(initialCount, maxCount);
  22. }
  23. public void Wait()
  24. {
  25. WaitAsync().Wait();
  26. }
  27. public Task WaitAsync()
  28. {
  29. var tcs = new TaskCompletionSource<bool>();
  30. queue.Enqueue(tcs);
  31. semaphore.WaitAsync().ContinueWith(t =>
  32. {
  33. TaskCompletionSource<bool> popped;
  34. if (queue.TryDequeue(out popped))
  35. popped.SetResult(true);
  36. });
  37. return tcs.Task;
  38. }
  39. public void Release()
  40. {
  41. semaphore.Release();
  42. }
  43. }
  44. }