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 WriteToFile() { while (ProgramManager.stop) { Monitor.Enter(ProgramManager.lock2); Monitor.Enter(ProgramManager.lock3); // блокирую List Monitor.Exit(ProgramManager.lock2); foreach (object _objW in ProgramManager.list) { ObjForWriter objW = (ObjForWriter)_objW; Console.WriteLine("{0}+{1}", objW.readNumber, writeNumber); if (objW.readNumber == writeNumber) { writeStream.Write(objW.array, 0, objW.memoryPosition); objW.readNumber = -1; writeNumber++; } } for (int i = 0; i < ProgramManager.list.Count; i += 0) // удаляю объекты, части которых были записаны { ObjForWriter objW2 = (ObjForWriter)ProgramManager.list[i]; if (objW2.readNumber == -1) { ProgramManager.list.Remove(objW2); } else { i++; } } Monitor.Exit(ProgramManager.lock3); } Console.WriteLine("Close"); writeStream.Close(); }