我需要一些关于多线程的建议。多线程 - 产生多线程并等待
例如:我想产生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下载。当队列为空时,线程应该完成。
我也会使用这个解决方案。 – laszlokiss88 2012-07-12 12:17:07
使用'ThreadPool'类似乎更容易,因为它封装了所有上述机制。 – Tudor 2012-07-12 12:52:19
尝试
SlimSemaphore slm=new SlimSemaphore(40);
slm.Wait()
[your code]
slm.Release();
这将只允许40线程同时执行。
注:SlimSemaphore(如果使用.NET Framework 4.0) 其他 信号灯
only efficiency difference is there
您可以使用ParallelOptions设置MaxDegreeParallelism对象创建和供应的Parallel.ForEach loop.I会粘贴一些代码当我稍后再次在适当的键盘后面时。
查看.NET 4.0 Task Parallel Library。 – Steven 2012-07-12 12:17:56
确实,使用TPL(http://msdn.microsoft.com/zh-cn/library/dd460717.aspx)。 40从哪里来?让TPL调度机制决定要运行多少个并发任务,这很好。 – Maarten 2012-07-12 12:20:26
40和200是变量,用户可以输入。我会看看tpl,谢谢。 – Mek 2012-07-12 12:24:45