【发布时间】: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 的方法。