C#线程池限制线程数。
C#线程池限制线程数。
好的...我已经对这个网站进行了充分的搜索,并阅读了许多关于这个话题的帖子。我发现这个问题:Code for a simple thread pool in C#特别有帮助。
然而,似乎总是有所不同的是,我所需要的东西稍有不同。
我已经查看了MSDN的示例,并将其根据我的需求进行了一些调整。我所指的示例在这里:https://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx
我的问题是这样的。我有一段相当简单的代码,通过HttpWebRequest
和WebResponse
类加载网页,并通过Stream
读取结果。由于需要执行很多次,我在一个线程中启动了这个方法。这个方法本身很简短,但需要执行的次数(每次的数据都不同)不确定,可能是1到200次。
我读到的所有东西似乎都表明ThreadPool
类是最佳选择。这里的问题在于,我可能需要启动这个东西100次,但我最多只能运行3个线程(对于这个特定的任务)。
我尝试通过以下方式设置ThreadPool
上的MaxThreads
:
ThreadPool.SetMaxThreads(3, 3);
我并不完全相信这种方法是否有效。此外,我不想干扰其他在运行该代码的系统上运行的网站或程序。因此,通过限制ThreadPool
上的线程数量,我可以确定这只适用于我的代码和我的线程吗?
MSDN的示例使用了事件驱动方法,并调用了WaitHandle.WaitAll(doneEvents);
,这就是我的做法。
因此,我问题的核心是,如何确保或指定可以运行其代码的最大线程数,但在之前的线程完成后继续运行更多线程,直到某个任意点?我这样处理对吗?
诚挚地,
Jason
好的,我采用了信号量的方法,并完全删除了ThreadPool
的代码。这似乎很简单。我从这里获取了信息:https://www.albahari.com/threading/part2.aspx
正是这个例子向我展示了如何:
[下面的文本是从该网站复制/粘贴的]
容量为1的Semaphore
类似于Mutex
或lock
,但Semaphore
没有"所有者" - 它是与线程无关的。任何线程都可以调用Semaphore
的Release
方法,而只有获取资源的线程才能释放它。
在以下示例中,十个线程在一个循环中执行一个Sleep
语句。一个Semaphore
确保不超过三个线程可以同时执行该Sleep
语句:
class SemaphoreTest { static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3 static void Main() { for (int i = 0; i < 10; i++) new Thread(Go).Start(); } static void Go() { while (true) { s.WaitOne(); Thread.Sleep(100); // 只有3个线程可以同时执行到这里 s.Release(); } } }