Мне нужно разработать приложение, использующее многопоточность.
По сути, у меня есть DataTable, который содержит около 200 тыс. Строк.
Из каждой строки мне нужно взять поле, сравнить его с веб-страницей,
а затем удалите его из таблицы данных.
Дело в том, что сервер, обслуживающий эти страницы, имеет ограничение на количество одновременных запросов.
так что в максимуме я могу попросить 3 страницы одновременно.
Я хочу сделать это с помощью пула потоков,
Мне даже удалось создать простое приложение, которое делает это (блокирует данные)
но я не мог ограничить параллельные потоки (даже с SetMaxThreads), похоже, он просто проигнорировал ограничение.
у кого-нибудь есть что-то готовое, что-то подобное?
Я хотел бы видеть.
Я пытался использовать семафоры, но столкнулся с проблемами:
static SemaphoreSlim _sem = new SemaphoreSlim(3); // Capacity of 3
static List<string> records = new List<string>();
static void Main()
{
records.Add("aaa");
records.Add("bbb");
records.Add("ccc");
records.Add("ddd");
records.Add("eee");
records.Add("fff");
records.Add("ggg");
records.Add("iii");
records.Add("jjj");
for (int i = 0; i < records.Count; i++ )
{
new Thread(ThreadJob).Start(records[i]);
}
Console.WriteLine(records.Count);
Console.ReadLine();
}
static void ThreadJob(object id)
{
Console.WriteLine(id + " wants to enter");
_sem.Wait();
Console.WriteLine(id + " is in!"); // Only three threads
//Thread.Sleep(1000 * (int)id); // can be here at
Console.WriteLine(id + " is leaving"); // a time.
lock (records)
{
records.Remove((string)id);
}
_sem.Release();
}
это работает довольно хорошо, единственная проблема,
Console.WriteLine(records.count);
возвращает разные результаты.
даже из-за того, что я понимаю, что это происходит, так как не все потоки закончили (я вызываю records.count до того, как все записи были удалены), я не мог найти, как ждать, пока все не закончится.