我需要一些关于多线程的建议。
示例:我想生成 200 个线程,每个线程都应该从网站上抓取一张不同的图片(该网站有点慢)。但应该有最大值。一次 40 个线程。
任何的想法?
我期待一些答案。
我需要一些关于多线程的建议。
示例:我想生成 200 个线程,每个线程都应该从网站上抓取一张不同的图片(该网站有点慢)。但应该有最大值。一次 40 个线程。
任何的想法?
我期待一些答案。
您可以轻松地使用ThreadPool
它。池在管理线程方面做得很好,但如果你真的必须限制你可以使用的最大数量:
ThreadPool.SetMaxThreads(40, 40);
// submit 200 tasks to the pool
for(int i = 0; i < 200; i++)
{
ThreadPool.QueueUserWorkItem(
() =>
{
// code for each task
});
}
不幸的是,没有内置的方法可以等待任务完成,所以你只需要即兴创作一些东西。如果您有权访问 .NET 4.0,您可以查看Parallel.For
:
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 40;
Parallel.For(0, 200, po,
i =>
{
// code for each task
});
使用一个线程安全的队列,里面装满了你想要的所有 URL。
创建 40 个线程,其任务是从该队列中获取下一个项目并从 URL 下载。当队列为空时,线程应该完成。
尝试
SlimSemaphore slm=new SlimSemaphore(40);
slm.Wait()
[your code]
slm.Release();
这将只允许一次执行 40 个线程。
注意:SlimSemaphore(如果使用 .Net 框架 4.0)else Semaphore
only efficiency difference is there
您可以使用您创建并提供给 Parallel.ForEach 循环的 ParallelOptions 对象设置 MaxDegreeParallelism。稍后当我再次使用正确的键盘时,我将粘贴一些代码。