public int ThreadPoolCompress(FileInfo fileToCompress, string archiveName) { FileManipulator manipulator = new FileManipulator(); List <FileInfo> chunks = manipulator.Split(fileToCompress.Name, Const.CHUNK_SIZE_IN_MGBS, archiveName); ManualResetEvent[] doneEvents = new ManualResetEvent[chunks.Count]; List <ICompressorMultiThread> compressors = new List <ICompressorMultiThread>(); int i = 0; //compress each chunk separately using ThreadPool foreach (var chunk in chunks) { doneEvents[i] = new ManualResetEvent(false); ICompressorMultiThread c = new CompressorMultiThread(doneEvents[i], chunk, archiveName + i.ToString(), true); compressors.Add(c); ThreadPool.QueueUserWorkItem(c.ThreadPoolCallback, i); i += 1; } WaitHandle.WaitAll(doneEvents); List <FileInfo> compressedChunks = new List <FileInfo>(); foreach (var chunk in chunks) { compressedChunks.Add(new FileInfo(chunk.Name + ".gz")); } //merge results back together manipulator.Merge(compressedChunks, archiveName); //bit AND on results of each of the compressors return(compressors.Select(c => c.Status()).Aggregate((x1, x2) => x1 & x2)); }
private List <FileInfo> SplitFiles(FileManipulator manipulator) { int megabyteCount = Const.CHUNK_SIZE_IN_MGBS; return(manipulator.Split(bigXml, megabyteCount, folderName)); }