我需要一些关于多线程的建议。
示例:我想生成200个Threads,每个人应该从网站上抓取一个不同的图像(该网站有点慢)。但应该有最大值。一次40个线程。
有什么想法吗?
我期待着一些答案。
答案 0 :(得分:2)
您可以轻松使用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
});
答案 1 :(得分:1)
使用线程安全的队列,填充所需的所有URL。
创建40个线程,其作用是从该队列中获取下一个项目并从URL下载。当队列为空时,线程应该完成。
答案 2 :(得分:0)
试
SlimSemaphore slm=new SlimSemaphore(40);
slm.Wait()
[your code]
slm.Release();
这将允许一次只执行40个线程。
注意:SlimSemaphore(如果使用.Net framework 4.0) 其他 旗语
only efficiency difference is there
答案 3 :(得分:0)
您可以使用您创建的ParallelOptions对象设置MaxDegreeParallelism并提供给Parallel.ForEach循环。当我稍后再次使用适当的键盘时,我会粘贴一些代码。