Многопоточное чтение - сжатие - запись файла - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Необходимо выполнить компрессию файла, причем чтение, запись и сжатие должны проходить в разных потоках. Таким образом, скажем, запись не должна зависеть от чтения (при этом используя стандартные средства 3.5). Попробовал реализовать конвейерную модель. Читал в один массив, сжимал в другой, записывал в файл - это не сработало, т.к. память не резиновая. Хотелось бы узнать, в каком направлении мне двигаться, т.к. с потоками работал мало. Использовать асинхронные варианты методов?

Решение задачи: «Многопоточное чтение - сжатие - запись файла»

textual
Листинг программы
public class BoundedBuffer<E>
    {
        private readonly Semaphore availableItems;
        private readonly Semaphore availableSpaces;
        private readonly E[] items;
        private int putPosition = 0;
        private int takePosition = 0;
 
        public BoundedBuffer(int capacity) {
            availableSpaces = new Semaphore(capacity, capacity);
            availableItems = new Semaphore(0, capacity);
            items = new E[capacity];
        }
 
        public void Add(E item)
        {
            availableSpaces.WaitOne();
            lock (items)
            {
                int i = putPosition;
                items[i] = item;
                putPosition = (++i == items.Length) ? 0 : i;
            }
            availableItems.Release();
        }
 
        public E Take()
        {
            availableItems.WaitOne();
            E item;
            lock (items)
            {
                int i = takePosition;
                item = items[i];
                items[i] = default(E);
                takePosition = (++i == items.Length) ? 0 : i;
            }
            availableSpaces.Release();
            return item;
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5