У меня есть Семафор, который, как предполагается, ограничивается 3, однако, это просто звонит столько, сколько он хочет. Я предполагаю, что это потому, что я использую (1000). Однако, когда я пытаюсь просто(), он никогда не пройдет WaitOne, я не уверен, что делать здесь.Семафор WaitOne работает некорректно
private static Semaphore _pool;
_pool = new Semaphore(0, 3);
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),options, drow =>
{
using (var WCC = new MasterCrawlerClass())
{
ActiveThreads++;
_pool.WaitOne(1000);
Console.WriteLine("Active Thread #: " + ActiveThreads);
WCC.MasterCrawlBegin(drow);
Console.WriteLine("Done Crawling a datarow");
ActiveThreads--;
_pool.Release();
}
});
Видя, как вы устанавливаете maxdop на 1, что использует Parallel.ForEach, вы действительно купите вас здесь? Тело цикла также, вероятно, будет работать в ThreadPool, где код блокировки большой нет-нет. Вы также должны быть защищены от одновременного доступа к ActiveThreads. Можете ли вы объяснить, что вы пытаетесь сделать здесь? Вероятно, есть лучший способ. – spender
@spender Все, что я хочу сделать, это ограничить количество раз Parallel.Foreach фактически вызывает WCC –
Предел к чему? Не более 3 параллельных обходов? – spender