【问题标题】:Limiting thread count with Semaphore Slim [duplicate]使用 Semaphore Slim 限制线程数 [重复]
【发布时间】:2021-03-04 01:59:40
【问题描述】:

我有一个 while 循环,我想初始化线程,但是下面的代码最终创建了近 50 个线程。远高于我的预期限制 5 不知道我做错了什么。

public static SemaphoreSlim scraperSemaphore = new SemaphoreSlim(5);

private void startScraper()
        {

            while (Core.Scraper.UsernameQueue.Count > 0)
            {

                string uName = Core.Scraper.UsernameQueue.Dequeue();                
                scraperSemaphore.Wait();
                Thread t = new Thread(() => Core.Scraper.scrapeFunction(uName));
                t.Start();
                scraperSemaphore.Release();

            }
                      

        }

【问题讨论】:

  • 你只需要锁来启动一个新线程。没有什么可以说在线程完成之前需要持有锁。所以你可以同时启动 5 个线程,但是一旦你完成了一个线程的启动,其他人就可以来启动另一个,不管你已经启动的线程是否已经完成。 scrapeFunction 必须是释放信号量的东西,当它完成处理(或以其他方式退出)
  • 另请参阅 stackoverflow.com/questions/10806951/… 了解特定于 async/await 的方法。

标签: c# semaphore


【解决方案1】:

我建议将Parallel.Foreach 与阻塞集合一起使用。

var queue = new BlockingCollection<string>(new ConcurrentQueue<string>());
var options = new ParallelOptions(){MaxDegreeOfParallelism = 3}
Parallel.ForEach(queue.GetConsumingEnumerable() , options , (item) => {...})

parallel.Foreach 与 Blockingcollection 的组合可能会创建一些不需要的同步,这可能会影响性能,也可能不会影响性能。有一些扩展可以解决这个问题。请参阅 Stephen Toub 的博文 ParallelExtensionsExtras Tour – #4 – BlockingCollectionExtensions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多