/// <summary> /// Останавливат работу /// </summary> public void Stop() { if (_selfSignal == null) { return; } _signal.Reset(); _job = null; _selfSignal.Set(); }
/// <summary> /// Дает потоку работу на исполнение. /// </summary> public void Start(BaseJob job) { // остановить другие потоки, пока выполняется работа _signal.Reset(); // установить задачу _job = job; if (_jobThread.ThreadState == ThreadState.Unstarted) { _jobThread.Start(); } // разблокировать вунтренний цикл _selfSignal.Set(); }
/// <summary> /// Запускает потоки. /// </summary> /// <param name="outFilename">входной файл</param> /// <param name="workerCount">количество потоков</param> public void Run(string outFilename, int workerCount) { List <WorkerResult> completeWorks = new List <WorkerResult>(); // создали N потоков List <ThreadWorker> workers = new List <ThreadWorker>(); for (int i = 0; i < workerCount; i++) { ThreadWorker worker = new ThreadWorker(); workers.Add(worker); } using (FileStream outStream = new FileStream(outFilename, FileMode.Create, FileAccess.Write)) { while (true) { for (int i = 0; i < workerCount; i++) { BaseJob job = _iterator.NextJob(); if (job != null) { workers[i].Start(job); } else { workers[i].Stop(); } } // пока работают потоки, пишем результаты в файл for (int i = 0; i < completeWorks.Count; i++) { byte[] data = completeWorks[i].JobData; outStream.Write(data, 0, data.Length); } // ожидаем пока рабочии выполнят задачи for (int i = 0; i < workers.Count; i++) { workers[i].WaitOne(); } // собрали результаты работы completeWorks = new List <WorkerResult>(); for (int i = 0; i < workers.Count; i++) { if (workers[i].Job != null && workers[i].Job.JobResult.JobData.Length > 0) { completeWorks.Add(workers[i].Job.JobResult); } } if (completeWorks.Count == 0) { break; } } } }