private static void addCompletedTask(CompressionTask task) { lock (m_completedTask) { m_completedTask.Add(task.Id, task); } }
public static void ExecuteTask(CompressionTask task) { lock (m_tasks) { m_tasks.Enqueue(task); Monitor.Pulse(m_tasks); } }
public virtual void Handle(CompressionTask task) { if (task.Exception == null) { m_numberOutputBytes += task.ResultData.Length; //Console.WriteLine($"completed task: {task.Id}, block: {task.ResultData.Length}"); m_outputStream.Write(task.ResultData, 0, task.ResultData.Length); m_outputStream.Flush(); } else { throw task.Exception; } }
private static void dataProcessing() { while (true) { CompressionTask task = null; lock (m_tasks) { while (m_tasks.Count == 0) { Monitor.Wait(m_tasks); } task = m_tasks.Dequeue(); } task.Execute(); addCompletedTask(task); } }
public static CompressionTask GetCompletedTask(int index) { CompressionTask task = null; lock (m_completedTask) { if (m_completedTask.ContainsKey(index)) { if (m_completedTask.TryGetValue(index, out task)) { m_completedTask.Remove(index); } } } if (task != null) { lock (m_tasks) { Monitor.Pulse(m_tasks); return(task); } } return(null); }
public void Execute(CompressionMode mode, string sourceFileName, string targetFileName) { CompressionTaskResultHandler taskResultHandler = null; Exception exception = null; try { using (FileStream inputStream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read)) { long offsetBytes = 0; int countBytes = 0; int countTask = 0; for (countTask = 0; ; ++countTask) { if (inputStream.Position >= inputStream.Length) { break; } if (mode == CompressionMode.Compress) { countBytes = checked ((int)calculateSizeBlock(inputStream.Length - offsetBytes)); } else { byte[] sizeBlock = new byte[m_sizeBlockSize]; inputStream.Read(sizeBlock, 0, m_sizeBlockSize); offsetBytes += m_sizeBlockSize; countBytes = BitConverter.ToInt32(sizeBlock, 0); } CompressionTask task = new CompressionTask(countTask, mode, sourceFileName, countBytes, offsetBytes); CustomFixedThreadPool.ExecuteTask(task); //Console.WriteLine($"process part {i} bytes from {offsetBytes} to {offsetBytes + countBytes} ({countBytes}), all {inputStream.Length} bytes"); offsetBytes += countBytes; inputStream.Seek(countBytes, SeekOrigin.Current); } //Console.WriteLine($"pos:{inputStream.Length}, length: {inputStream.Length}"); taskResultHandler = new CompressionTaskResultHandler(targetFileName); int completedTask = 0; while (completedTask != countTask) { CompressionTask task = CustomFixedThreadPool.GetCompletedTask(completedTask); if (task == null) { Thread.Sleep(5); } else { taskResultHandler.Handle(task); task.Dispose(); completedTask++; } } Console.WriteLine($"Size source file: {inputStream.Length} bytes"); Console.WriteLine($"Size target file: {taskResultHandler.NumberOutputBytes} bytes"); Console.WriteLine($"Start task: {countTask}, completed task: {completedTask}"); } } catch (Exception externException) { exception = externException; } finally { if (taskResultHandler != null) { taskResultHandler.Dispose(); } if (exception != null) { throw exception; } } }