public void Zip(object o) { objW = new ObjForWriter(); memStream = new MemoryStream(0); compressionStream = new GZipStream(memStream, CompressionMode.Compress); Monitor.Enter(ProgramManager.lock1); ObjForZipper objZ = (ObjForZipper)o; objW.readNumber = objZ.readNumber; byte[] arrayZ = new byte[objZ.array.Length]; int p = 0; foreach (byte _byte in objZ.array) { arrayZ[p] = _byte; p++; } Monitor.Exit(ProgramManager.lock1); compressionStream.Write(arrayZ, 0, arrayZ.Length); // собственно, та нагрузка, котора параллелится objW.memoryPosition = (int)memStream.Position; objW.array = memStream.ToArray(); Monitor.Enter(ProgramManager.lock3); // блокирую коллекцию для загрузки в нее сжатого массива ProgramManager.list.Add(objW); Monitor.Exit(ProgramManager.lock3); }
public void Compress() { Thread thread = new Thread(writer.WriteToFile); thread.Start(); while (i < reader.sourceStream.Length) { Monitor.Enter(lock2); for (int c = 0; c < 3; c++) { Console.WriteLine(i); Thread thread2 = new Thread(new ParameterizedThreadStart(zipper.Zip)); threads.Add(thread2); Monitor.Enter(lock1); objZ = reader.ReadPortion(); thread2.Start(objZ); Monitor.Exit(lock1); i += size; Thread.Sleep(200);// ждем запуск потока чтоб он захватил лок1 } Monitor.Exit(lock2); } do { w = false; foreach (Thread h in threads) // проверка, что есть живые потоки { if (h.IsAlive == true) { w = true; } } }while (w); // цикл для проверки статуса выполнения потоков сжатия stop = false; }