コード例 #1
0
ファイル: QueueTests.cs プロジェクト: ionuttamas/LockFree
        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);
        }
コード例 #2
0
        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
            });
        }