Exemplo n.º 1
0
        /// <summary>
        /// Останавливат работу
        /// </summary>
        public void Stop()
        {
            if (_selfSignal == null)
            {
                return;
            }

            _signal.Reset();
            _job = null;
            _selfSignal.Set();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Дает потоку работу на исполнение.
        /// </summary>
        public void Start(BaseJob job)
        {
            // остановить другие потоки, пока выполняется работа
            _signal.Reset();

            // установить задачу
            _job = job;
            if (_jobThread.ThreadState == ThreadState.Unstarted)
            {
                _jobThread.Start();
            }

            // разблокировать вунтренний цикл
            _selfSignal.Set();
        }
Exemplo n.º 3
0
        /// <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;
                    }
                }
            }
        }