当前位置:  开发笔记 > 编程语言 > 正文

C#线程池限制线程

如何解决《C#线程池限制线程》经验,为你挑选了1个好方法。



1> Michael Hare..:

注意:如果您将此限制为"3"只是为了不让运行应用程序的机器淹没,我首先要确保这是一个问题.线程池应该为你管理这个.另一方面,如果你不想压倒其他一些资源,请继续阅读!


您无法管理线程池的大小(或者实际上关于它的任何内容).

在这种情况下,我将使用信号量来管理对资源的访问.在您的情况下,您的资源正在运行Web scrape,或计算某些报告等.

为此,在静态类中,创建一个信号量对象:

System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3);

然后,在每个线程中,您执行此操作:

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();
}

每个线程将在S.WaitOne()上阻塞,直到给出信号继续.一旦S减少了3次,所有线程都会阻塞,直到其中一个增加计数器.

这个解决方案并不完美.


如果您想要更清洁,更高效的东西,我建议您使用BlockingQueue方法,其中您将要执行的工作排入全局阻塞队列对象.

同时,你有三个线程(你创建的 - 不在线程池中),弹出队列中的工作来执行.这不是那么棘手的设置,而且非常快速和简单.

例子:

最佳线程队列示例/最佳实践

在并发程序中从BlockingQueue获取对象的最佳方法?

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有