我有一个信号量,可以限制为3个,但是,这个信号量一直在不断增加。我假设这是因为我使用(1000)。但是,当我只尝试()时,它将永远不会通过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();

    }
});

最佳答案

您正在错误构造信号量。应该是_pool = new Semaphore(3, 3);这样做,也将不需要将超时参数传递给WaitOne()

第一个参数是阻塞之前可能被批准的请求的初始数量,因此传递0表示对WaitOne()的任何后续调用都将立即阻塞。

08-06 14:22