Example #1
0
        /// <summary>
        /// Метод для потока чтения. Чтение и генерация задач сжатия происходит в 1 поток, что даёт максимальную нагрузку на диск
        /// </summary>
        /// <param name="obj">
        /// Дескриптор файла для записи
        /// </param>
        private void ReadingThread(object obj)
        {
            FileDescriptor read_file = obj as FileDescriptor;

            try
            {
                using (FileStream _fileToBeCompressed = read_file.GetDescription.OpenRead())
                {
                    Int64 lastBlock = 0;
                    while (lastBlock < _totalCount && !_cancellationToken.IsCancellationRequested)
                    {
                        // Защита от переполнения памяти
                        if (_compressTaskPool.TaskCount() > _maxTasks * _cores)
                        {
                            Thread.Sleep(1);
                            continue;
                        }
                        ITaskInfo taskInfo = null;
                        taskInfo = _readTaskPool.NextTask();
                        if (taskInfo == null)
                        {
                            Thread.Sleep(_sleep);
                            continue;
                        }
                        _compressTaskPool.AddTask(_taskFactory.CreateProcessTaskInfo(lastBlock++, (taskInfo.Execute(_fileToBeCompressed) as byte[])));
                    }
#if DEBUG
                    Console.WriteLine("End of reading");
#endif
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine("Error on file reading");
#if DEBUG
                Console.WriteLine(exc);
#endif
            }
        }
        /// <summary>
        /// Метод для потока чтения. Чтение и генерация задач сжатия происходит в 1 поток, что даёт максимальную нагрузку на диск
        /// </summary>
        /// <param name="obj">
        /// Дескриптор файла для чтения
        /// </param>
        private void ReadingThread(object obj)
        {
            FileDescriptor readFile = obj as FileDescriptor;

            _fileLength = readFile.GetDescription.Length;
            try
            {
                using (FileStream fileToBeDecompressed = readFile.GetDescription.OpenRead())
                {
                    // Читать блоки архива, пока не закончится файл
                    while (fileToBeDecompressed.Position < _fileLength && !_cancellationToken.IsCancellationRequested)
                    {
                        _position = fileToBeDecompressed.Position;
                        // Защита от переполнения памяти
                        if (_compressTaskPool.TaskCount() > _maxTasks * _cores)
                        {
                            Thread.Sleep(_sleep);
                            continue;
                        }
                        ITaskInfo task = _taskFactory.CreateReadTaskInfo(_batchCount, 0);
                        _compressTaskPool.AddTask(_taskFactory.CreateProcessTaskInfo(_batchCount++, task.Execute(fileToBeDecompressed) as byte[]));
                    }
                    _isReading = false;
#if DEBUG
                    Console.WriteLine("End of reading");
#endif
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine("Error on file reading");
#if DEBUG
                Console.WriteLine(exc);
#endif
            }
        }