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--;