示例#1
0
        /// <summary>
        /// Запуск нового потока на сжатие блока из очереди, при условии, что в пуле потоков есть свободный поток или свободное место в пуле
        /// </summary>
        private bool TryStartNewCompressThread()
        {
            try
            {
                int index;
                if (_threadPool.Any(x => x == null))
                {
                    index = Array.IndexOf(_threadPool, null); //заполнение пула
                    if (index >= 0)
                    {
                        var queueItem = _queueOfBlocks.Dequeue();
                        _threadPool[index] = new Thread(() => Compression(queueItem.Key, queueItem.Value));
                        _threadPool[index].Start();
                        return(true);
                    }
                }

                var stopedThread = _threadPool.FirstOrDefault(x => x != null && x.ThreadState == ThreadState.Stopped);
                if (stopedThread != null)
                {
                    var queueItem = _queueOfBlocks.Dequeue();
                    index = Array.IndexOf(_threadPool, stopedThread);
                    _threadPool[index] = new Thread(() => Compression(queueItem.Key, queueItem.Value));
                    _threadPool[index].Start();
                }
            }
            catch (EndQueueException)
            {
                return(false);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }

            return(true);
        }