public void QueuePerformanceTest()
        {
            var stats = new List<TestStat>();

            for (var testIndex = 0; testIndex < 100; testIndex++)
            {
                var queue = new ConcurrentQueue<QItem>();

                var dt = new DisposerTest(
                    new PessimisticDisposer(),
                    (threadIndex) =>
                    {
                        var q = new QItem(threadIndex);
                        queue.Enqueue(q);
                    },
                    () =>
                    {
                        var q = new QItem(-1);
                        queue.Enqueue(q);
                    }
                    );

                var threadCount = Environment.ProcessorCount + 2;
                var timeout = 50;

                Debug.WriteLine("Test {0} (threads = {1}, timeout = {2})    ", testIndex, threadCount, timeout);

                dt.DoTest(
                    threadCount,
                    timeout
                    );

                //преобразуем в лист

                var resultList = new List<QItem>();

                QItem current;
                while (queue.TryDequeue(out current))
                {
                    resultList.Add(current);
                }

                //анализируем лист

                //проверяем что диспоуз 1
                if (resultList.Count(j => j.ThreadId == -1) != 1)
                {
                    throw new InvalidOperationException("диспоузов несколько");
                }

                //проверяем что диспоуз последний
                if (resultList.Last().ThreadId != -1)
                {
                    throw new InvalidOperationException("диспоуз не последний");
                }

                //собираем и сохраняем статистику
                var th = new long[threadCount];
                foreach (var i in resultList)
                {
                    if (i.ThreadId >= 0)
                    {
                        th[i.ThreadId]++;
                    }
                }

                var stat = new TestStat(
                    th,
                    resultList.Count - 1 // - 1 это вычесть евент диспоуза
                    );

                stats.Add(stat);

                GC.Collect(3);
                GC.WaitForPendingFinalizers();
                GC.Collect(3);
            }

            Debug.WriteLine(string.Empty);
            Debug.WriteLine("Success");

            Debug.WriteLine("Total = {0}", stats.Sum(j => j.TotalCount));
        }
        public void QueueCorrectnessTest()
        {
            var random = new Random(
                int.Parse(Guid.NewGuid().ToString().Replace("-", "").Substring(0, 7), NumberStyles.HexNumber)
                );


            for (var testIndex = 0; testIndex < 150; testIndex++)
            {
                var queue = new ConcurrentQueue<QItem>();

                var dt = new DisposerTest(
                    new PessimisticDisposer(),
                    (threadIndex) =>
                    {
                        var q = new QItem(threadIndex);
                        queue.Enqueue(q);
                    },
                    () =>
                    {
                        var q = new QItem(-1);
                        queue.Enqueue(q);
                    }
                    );

                var threadCount = 2 + random.Next(Environment.ProcessorCount*2);
                var timeout = 5 + random.Next(20);

                Debug.WriteLine("Test {0} (threads = {1}, timeout = {2})    ", testIndex, threadCount, timeout);

                dt.DoTest(
                    threadCount,
                    timeout
                    );

                //преобразуем в лист

                var resultList = new List<QItem>();

                QItem current;
                while (queue.TryDequeue(out current))
                {
                    resultList.Add(current);
                }

                //анализируем лист

                //проверяем что диспоуз 1
                if (resultList.Count(j => j.ThreadId == -1) != 1)
                {
                    throw new InvalidOperationException("диспоузов несколько");
                }

                //проверяем что диспоуз последний
                if (resultList.Last().ThreadId != -1)
                {
                    throw new InvalidOperationException("диспоуз не последний");
                }

                GC.Collect(3);
                GC.WaitForPendingFinalizers();
                GC.Collect(3);
            }

            Debug.WriteLine(string.Empty);
            Debug.WriteLine("Success");
        }
        public void QueuePerformanceTest()
        {
            var stats = new List<TestStat>();

            for (var testIndex = 0; testIndex < 100; testIndex++)
            {
                var queue = new ConcurrentQueue<QItem>();

                var dt = new DisposerTest(
                    new ThreadUnsafeDisposer(),
                    (threadIndex) =>
                    {
                        var q = new QItem(threadIndex);
                        queue.Enqueue(q);
                    },
                    () =>
                    {
                        var q = new QItem(-1);
                        queue.Enqueue(q);
                    }
                    );

                var threadCount = Environment.ProcessorCount + 2;
                var timeout = 50;

                Debug.WriteLine("Test {0} (threads = {1}, timeout = {2})    ", testIndex, threadCount, timeout);

                dt.DoTest(
                    threadCount,
                    timeout
                    );

                //преобразуем в лист

                var resultList = new List<QItem>();

                QItem current;
                while (queue.TryDequeue(out current))
                {
                    resultList.Add(current);
                }

                //не анализируем лист, так как это фейковый диспозер

                //собираем и сохраняем статистику
                var th = new long[threadCount];
                foreach (var i in resultList)
                {
                    if (i.ThreadId >= 0)
                    {
                        th[i.ThreadId]++;
                    }
                }

                var stat = new TestStat(
                    th,
                    resultList.Count - 1 // - 1 это вычесть евент диспоуза
                    );

                stats.Add(stat);

                GC.Collect(3);
                GC.WaitForPendingFinalizers();
                GC.Collect(3);
            }

            Debug.WriteLine(string.Empty);
            Debug.WriteLine("Success");

            Debug.WriteLine("Total = {0}", stats.Sum(j => j.TotalCount));
        }