Re[4]: Ручная реализация очереди потоков
От: GuyFawkes  
Дата: 23.12.09 08:26
Оценка:
Codechanger, слышал. Но какой смысл мне вручную переписывать по сути тот же самый функционал backgroundWorker, если ThreadPool никак не может упростить мне задачу? Возможно, вы все же дадите какие-то замечания по следующему коду:


            BackgroundWorker main = new BackgroundWorker();
            main.DoWork += DoWorkersWatcher;
            main.RunWorkerCompleted += new RunWorkerCompletedEventHandler(main_RunWorkerCompleted);
            main.RunWorkerAsync(1);

так я по щелчку, к примеру, на кнопку запустил "управляющий" поток

        private void DoWorkersWatcher(object s, DoWorkEventArgs args)
        {
            Int32 WorkType = Convert.ToInt32(args.Argument.ToString());
            workers.Clear();
            int i = 0;
            while (true)
            {
                // вынести одинаковое в процедуры - писалось без оптимизации для чистой наглядности по ходу разработки
                switch (WorkType)
                {
                    case 1:
                        if (QueryCounter == rpList.Count)
                        {
                            workers.Clear();
                            WorkType++;
                            QueryCounter = 0;
                            CurrentThreadCount = 0;
                            i = 0;
                            break;
                        }
                        if ((CurrentThreadCount < MaxThreadsCount) && (i <= rpList.Count))
                        {
                            BackgroundWorker bw = new BackgroundWorker();
                            bw.DoWork += DoSaveFirstInfoWork;
                            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted1);
                            workers.Add(bw);
                            bw.RunWorkerAsync(i);
                            CurrentThreadCount++;
                            i++;
                        }
                        break;
                    case 2:
                        if (QueryCounter == rpList.Count)
                        {
                            WorkType++;
                            break;
                        }
                        if ((CurrentThreadCount < MaxThreadsCount) && (i <= rpList.Count))
                        {
                            BackgroundWorker bw = new BackgroundWorker();
                            bw.DoWork += DoSavePageInfoWork;
                            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted2);
                            workers.Add(bw);
                            bw.RunWorkerAsync(i);
                            CurrentThreadCount++;
                            i++;
                        }
                        break;
                }
                if (WorkType == 9)
                {
                    args.Result = "finished";
                    return;
                }
            }
        }



а в обработке RunWorkerCompleted в конце стоят строки

            QueryCounter++;
            CurrentThreadCount--;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.