/// <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); }