1

我需要一些关于多线程的建议。

示例:我想生成 200 个线程,每个线程都应该从网站上抓取一张不同的图片(该网站有点慢)。但应该有最大值。一次 40 个线程。

任何的想法?

我期待一些答案。

4

4 回答 4

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
   });
于 2012-07-12T12:51:37.680 回答
1

使用一个线程安全的队列,里面装满了你想要的所有 URL。

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

于 2012-07-12T12:14:22.807 回答
0

尝试

SlimSemaphore slm=new SlimSemaphore(40);

slm.Wait()

[your code]

slm.Release();

这将只允许一次执行 40 个线程。

注意:SlimSemaphore(如果使用 .Net 框架 4.0)else Semaphore

 only efficiency difference is there
于 2012-07-12T12:24:28.890 回答
0

您可以使用您创建并提供给 Parallel.ForEach 循环的 ParallelOptions 对象设置 MaxDegreeParallelism。稍后当我再次使用正确的键盘时,我将粘贴一些代码。

于 2012-07-12T12:48:03.673 回答