好吧...我已经对该网站进行了公平的搜索,并阅读了许多有关此主题的帖子。我发现这个问题:Code for a simple thread pool in C#特别有用。
但是,似乎总是如此,我需要的东西略有不同。
我查看了 MSDN 示例并对其进行了一些调整以适应我的需要。我参考的例子在这里:http: //msdn.microsoft.com/en-us/library/3dasc8as (VS.80,printer).aspx
我的问题是这个。HttpWebRequest
我有一组相当简单的代码,通过和WebResponse
类加载网页并通过Stream
. 我在一个线程中触发了这个方法,因为它需要执行很多次。该方法本身很短,但需要触发的次数(每次使用不同的数据)会有所不同。它可以是 1 到 200 之间的任何值。
我读过的所有内容似乎都表明该ThreadPool
班级是主要候选人。这就是事情变得棘手的地方。我可能需要启动这个东西说 100 次,但我最多只能运行 3 个线程(对于这个特定任务)。
我试过MaxThreads
在ThreadPool
通孔上设置:
ThreadPool.SetMaxThreads(3, 3);
我并不完全相信这种方法是有效的。此外,我不想破坏将在其上运行的系统上运行的其他网站或程序。那么,通过限制 上的线程ThreadPool
数,我可以确定这仅与我的代码和我的线程有关吗?
MSDN 示例使用事件驱动方法和调用WaitHandle.WaitAll(doneEvents);
,这就是我这样做的方式。
所以我的问题的核心是,如何确保或指定可以为其代码运行的最大线程数,但让代码继续运行更多线程,因为之前的线程完成直到某个任意点?我以正确的方式解决这个问题吗?
真挚地,
杰森
好的,我添加了信号量方法并完全删除了ThreadPool
代码。看起来很简单。我的信息来自:http ://www.albahari.com/threading/part2.aspx
正是这个例子向我展示了如何:
[下面的文字是从网站复制/粘贴]
容量为 one 的ASemaphore
类似于 a Mutex
or lock
,只是它Semaphore
没有“所有者”——它与线程无关。任何线程都可以调用Release
a Semaphore
,而使用Mutex
and lock
,只有获得资源的线程才能释放它。
在以下示例中,十个线程执行一个循环,Sleep
中间有一条语句。ASemaphore
确保不超过三个线程可以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); // Only 3 threads can get here at once
s.Release();
}
}
}