public void Queue_WithLowThreadCount_WorksCorrectly(int threads, int enqueues, int dequeues) { //The elements we insert are unique and sentinel value is -1 int initialValue = -1; int currentValue = initialValue; ConcurrentDictionary<int, int> table = new ConcurrentDictionary<int, int>(); Core.Queue.Queue<int> queue = new Core.Queue.Queue<int>(initialValue); ThreadBuilder .Empty() .AddThreads(() => { for (int i = 0; i < enqueues; i++) { int value = Interlocked.Increment(ref currentValue); queue.Enqueue(value); } }, threads) .AddThreads(() => { for (int i = 0; i < dequeues; i++) { int value = queue.Dequeue(); table.AddOrUpdate(value, x => 1, (k, v) => v + 1); } }, threads) .Start(); //The sentinel value can be returned more than once if queue is empty at the time of a dequeue int expectedDequeues = table.Keys.Count + (table.ContainsKey(initialValue) ? -1 : 0); int actualDequeues = table.Count(x => x.Key != initialValue && x.Value == 1); Assert.AreEqual(expectedDequeues, actualDequeues); }
public static QueueResource ToResource(this Core.Queue.Queue model) { if (model == null) { return(null); } return(new QueueResource { Id = model.Id, Series = model.Series.ToResource(), Episode = model.Episode.ToResource(), Quality = model.Quality, Size = model.Size, Title = model.Title, Sizeleft = model.Sizeleft, Timeleft = model.Timeleft, EstimatedCompletionTime = model.EstimatedCompletionTime, Status = model.Status, TrackedDownloadStatus = model.TrackedDownloadStatus, StatusMessages = model.StatusMessages, DownloadId = model.DownloadId, Protocol = model.Protocol }); }