private void ThreadProcess(object threadIndex)
        {
            var rand = new Random();

            while (!_stopThread)
            {
                try
                {
                    var addedItem = new KeyValuePair <int, string>((int)threadIndex, Guid.NewGuid().ToString());
                    ThreadInfoStore.Add(addedItem);
                    Console.WriteLine("Thread {0} add {1}", addedItem.Key, addedItem.Value);

                    var firstItem = ThreadInfoStore.First();
                    if ((int)threadIndex == firstItem.Key || ThreadInfoStore.Count > _threadInfoStoreSize)
                    {
                        ThreadInfoStore.TryTake(out firstItem);
                        Console.WriteLine("Thread {0} delete {1}", firstItem.Key, firstItem.Value);
                    }

                    Thread.Sleep(rand.Next(300));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        public void ShowStatistic()
        {
            Console.WriteLine(new string('=', 20));

            foreach (var group in ThreadInfoStore.OrderBy(pair => pair.Key).GroupBy(pair => pair.Key))
            {
                Console.WriteLine("Thread {0} - count = {1}", group.Key, group.Count());
            }

            Console.WriteLine("Max container elements: " + ThreadInfoStore.Count());
        }
        private void InitStore()
        {
            if (ThreadInfoStore != null)
            {
                ThreadInfoStore.Dispose();
            }
            if (ThreadStore != null)
            {
                ThreadStore.Dispose();
            }

            ThreadInfoStore = new BlockingCollection <KeyValuePair <int, string> >();
            ThreadStore     = new BlockingCollection <Thread>();
        }