c#Threadpool - 限制线程数

Bry*_*yan 20 c# multithreading threadpool

我正在开发一个控制台应用程序

我想使用Threadpool来执行Web下载.这是一些假代码.

 for (int loop=0; loop< 100; loop++)
 {
     ThreadPool.QueueUserWorkItem(new WaitCallback(GetPage), pageList[loop]);
 }


snip

private static void GetPage(object o)
{
    //get the page
}
Run Code Online (Sandbox Code Playgroud)

如何防止我的代码启动两个以上(或十个或其他)同步线程?

我试过了

    ThreadPool.SetMaxThreads(1, 0);
    ThreadPool.SetMinThreads(1, 0);
Run Code Online (Sandbox Code Playgroud)

但他们似乎没有任何影响.

Bri*_*eon 36

我会相应地使用Parallel.For和设置MaxDegreeOfParallelism.

Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 10 },
  i =>
  {
    GetPage(pageList[i]);
  });
Run Code Online (Sandbox Code Playgroud)


小智 16

只需反转以下代码:

ThreadPool.SetMaxThreads(1, 0);
ThreadPool.SetMinThreads(1, 0);
Run Code Online (Sandbox Code Playgroud)

至:

ThreadPool.SetMinThreads(1, 0);
ThreadPool.SetMaxThreads(1, 0);
Run Code Online (Sandbox Code Playgroud)

您不能将MaxThread设置为小于MinThread

  • 这是实际问题的答案:如何防止*我的*代码启动... (3认同)

Chr*_*ler 9

就个人而言,我会使用SmartThreadPool并单独使用ThreadPool.但是,这可能是您想要的:C#线程池限制线程

包含链接的代码(请给原作者信用,不是我)

System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3);  
try 
{     
  // wait your turn (decrement)     
  S.WaitOne();     
  // do your thing 
}  
finally 
{     
  // release so others can go (increment)     
  S.Release(); 
} 
Run Code Online (Sandbox Code Playgroud)


dkn*_*ack 5

描述

您可以使用该ThreadPool.SetMaxThreads方法执行此操作.

但是使用ThreadPool for WebRequest存在一些问题.例如,阅读(ThreadPool或HttpWebRequest中的错误?)

样品

ThreadPool.SetMaxThreads(2,2);
Run Code Online (Sandbox Code Playgroud)

编辑

我个人会使用AsParallel Linq,为此.

更多信息

  • 仅供参考...这限制了IIS ThreadPool中的线程总数,因此基本上用户将无法访问您的站点.此代码应该位于具有自己的线程池的单独网站上. (3认同)