2012-07-12 58 views
1

我需要一些关于多线程的建议。多线程 - 产生多线程并等待

例如:我想产生200个线程,每个应该从一个网站抓取一个不同的图像(该网站有点慢)。但应该有最大值。 40个线程一次。

有什么想法?

我期待着一些答案。

+1

查看.NET 4.0 Task Parallel Library。 – Steven 2012-07-12 12:17:56

+0

确实,使用TPL(http://msdn.microsoft.com/zh-cn/library/dd460717.aspx)。 40从哪里来?让TPL调度机制决定要运行多少个并发任务,这很好。 – Maarten 2012-07-12 12:20:26

+0

40和200是变量,用户可以输入。我会看看tpl,谢谢。 – Mek 2012-07-12 12:24:45

回答

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 
    }); 
+0

我打算做出同样的答案......对于ThreadPool,他可以使用一个带有上下文参数的回调函数来保存关于特定线程的信息。 – PedroC88 2012-07-12 13:28:31

+0

谢谢!这真的很有用。 – Mek 2012-07-12 13:52:16

1

使用线程安全队列,并填充所需的所有URL。

创建40个线程,其工作是从队列中取下一个项目并从URL下载。当队列为空时,线程应该完成。

+0

我也会使用这个解决方案。 – laszlokiss88 2012-07-12 12:17:07

+0

使用'ThreadPool'类似乎更容易,因为它封装了所有上述机制。 – Tudor 2012-07-12 12:52:19

0

尝试

SlimSemaphore slm=new SlimSemaphore(40); 

slm.Wait() 

[your code] 

slm.Release(); 

这将只允许40线程同时执行。

注:SlimSemaphore(如果使用.NET Framework 4.0) 其他 信号灯

only efficiency difference is there 
0

您可以使用ParallelOptions设置MaxDegreeParallelism对象创建和供应的Parallel.ForEach loop.I会粘贴一些代码当我稍后再次在适当的键盘后面时。