【发布时间】:2012-04-12 10:22:00
【问题描述】:
我有一个信号量,假设限制为 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();
}
});
【问题讨论】:
-
看到你将 maxdop 设置为 1,Parallel.ForEach 的用途实际上在这里给你买了什么?循环体也可能在线程池中运行,其中阻塞代码是一个很大的禁忌。您还应该防范对 ActiveThreads 的并发访问。你能解释一下你想在这里做什么吗?可能有更好的方法。
-
@spender 我想做的就是限制 Parallel.Foreach 实际调用 WCC 的次数
-
限制在什么范围内?最多 3 次并发抓取?
-
@spender 是的,那很好,但我真的只想说 int = ;以及任何限制
标签: c# multithreading semaphore