C#线程池限制线程数。

19 浏览
0 Comments

C#线程池限制线程数。

好的...我已经对这个网站进行了充分的搜索,并阅读了许多关于这个话题的帖子。我发现这个问题:Code for a simple thread pool in C#特别有帮助。

然而,似乎总是有所不同的是,我所需要的东西稍有不同。

我已经查看了MSDN的示例,并将其根据我的需求进行了一些调整。我所指的示例在这里:https://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx

我的问题是这样的。我有一段相当简单的代码,通过HttpWebRequestWebResponse类加载网页,并通过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类似于Mutexlock,但Semaphore没有"所有者" - 它是与线程无关的。任何线程都可以调用SemaphoreRelease方法,而只有获取资源的线程才能释放它。

在以下示例中,十个线程在一个循环中执行一个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();
        }
    }
}

0