Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. using System.Collections.Concurrent;
  2. using System.Threading.Tasks;
  3.  
  4. namespace AsyncQueue
  5. {
  6. public class AsyncLimitedQueue<TItem>
  7. {
  8. private readonly ConcurrentQueue<TItem> _itemsQueue = new ConcurrentQueue<TItem>();
  9. private readonly ConcurrentQueue<TaskCompletionSource<TItem>> _requestsQueue = new ConcurrentQueue<TaskCompletionSource<TItem>>();
  10. private readonly object _lock = new object();
  11. private readonly int _sizeLimit;
  12.  
  13. public AsyncLimitedQueue(int sizeLimit)
  14. {
  15. _sizeLimit = sizeLimit;
  16. }
  17.  
  18. public void Enqueue(TItem item)
  19. {
  20. if (_requestsQueue.TryDequeue(out TaskCompletionSource<TItem> completionSource))
  21. {
  22. completionSource.SetResult(item);
  23. return;
  24. }
  25.  
  26. lock (_lock)
  27. {
  28. if (_itemsQueue.Count < _sizeLimit)
  29. {
  30. _itemsQueue.Enqueue(item);
  31. }
  32. }
  33. }
  34.  
  35. public Task<TItem> DequeueAsync()
  36. {
  37. if (_itemsQueue.TryDequeue(out TItem item))
  38. {
  39. return Task.FromResult(item);
  40. }
  41.  
  42. var taskCompletionSource = new TaskCompletionSource<TItem>();
  43.  
  44. _requestsQueue.Enqueue(taskCompletionSource);
  45.  
  46. return taskCompletionSource.Task;
  47. }
  48. }
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement