Пул потоков - C#
Формулировка задачи:
Здравствуйте. Допустим, у нас есть массив из 1000 элементов и n потоков, которые должны обработать этот массив, но каждый поток должен обработать только один элемент массива, т.е. 1-ый поток обработал 1-ый элемент, 2-ой поток обработал 2-ой, ... , n-ый поток обработал n-ый элемент и т.д, пока не будут обработана вся эта тысяча элементов. В Java есть замечательный ExecutorService, который как раз подошел бы под мои нужды. Погуглил, нашел что-то похожее - ThreadPool. Попробовал и как-то не удачно. Получается, что локер будет позволять обрабатывать массив только одному потоку, что вроде как не является многопоточностью. Знатоки, как быть? Заранее благодарен.
static int iterat = 0;
static int iter = 0;
static object workerLocker = new object();
static void Main(string[] args)
{
iterat = list.Count;
for (int i = 0; i < iterat; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
ThreadPool.SetMinThreads(10, 10);
ThreadPool.SetMaxThreads(10, 10);
}
lock (workerLocker)
while (iter < iterat)
Monitor.Wait(workerLocker);
}
static void ThreadProc(Object stateInfo)
{
lock (workerLocker)
{
if (iter < list.Count)
{
string str = list[iter];
if (str != "")
{
Console.WriteLine(str);
}
}
iter++;
Monitor.Pulse(workerLocker);
}
}
}Решение задачи: «Пул потоков»
textual
Листинг программы
static void ThreadProc(Object stateInfo)
{
string str = (string)stateInfo;
if (str != "")
{
Console.WriteLine(str);
}
}