public void TestQueueByKey()
        {
            const int countIterator = 5;
            QueueByKey<String, string> queueByKey = new QueueByKey<String, string>();
            for (int i = 0; i < countIterator; i++)
            {
                string key = i.ToString();
                for (int iElement = 0; iElement < countIterator; iElement++)
                {
                    queueByKey.Enqueue(key, iElement.ToString());
                }
            }

            string value;
            int counter = 0;
            foreach ( var item in  queueByKey.Keys)
            {
                counter = 0;
                while ( (value = queueByKey.Dequeue(item)) != null)
                {
                    Console.WriteLine($"{item} => {value}");
                  
                    if (!value.Equals(counter.ToString())) throw new Exception("invalid value from Dequeue");
                    counter++;
                }
                Console.WriteLine($"----------------------");
                if (counter != countIterator) throw new Exception("Enqueue != Dequeue");
            }
        }
        public void TestQueueByKeyAsync()
        {
            const int countIterator = 5;
            const int threadCount = 5;

            List<Task> listTask = new List<Task>();
            Random random = new Random();

            QueueByKey<String, string> queueByKey = new QueueByKey<String, string>();
            for (int tk = 0; tk < threadCount; tk++)
            {
                int threadID = tk;
                var t = Task.Run(() =>
                {
                  
                    Thread.Sleep(random.Next(100, 2000));
                    for (int i = 0; i < countIterator; i++)
                    {
                        int iElement = 0;
                        var items = new List<int>();
                        string key = i.ToString();
                        while (items.Count < countIterator)
                        {
                            Task wait = Task.Delay(50);
                            wait.Wait();
                            while (items.Contains(iElement)) { iElement = random.Next(0, countIterator); }
                            items.Add(iElement);
                            queueByKey.Enqueue(key, iElement.ToString() + "/" + threadID.ToString());
                        }
                    }
                });
                listTask.Add(t);
            }

        

            Task.WaitAll(listTask.ToArray());

            string value;
          
            foreach (var item in queueByKey.Keys)
            {
              
                while ((value = queueByKey.Dequeue(item)) != null)
                {
                    Console.WriteLine($"{item} => {value}");
                }
                Console.WriteLine($"----------------------");

            }
        }