我想限制多线程WCF服务中的线程数。所以,我使用ThreadPool.SetMaxThread
函数。现在,我想使用System.Timers
以给定的时间间隔生成事件。
但是,我的服务同时收到许多要在线程池中执行的操作。当我的计时器结束时,操作在ThreadPool中排队(我有时会预期100,000个任务),因此执行起来很慢。
有没有办法在之前执行我过去的事件?例如,通过设置在线程池上排队的优先级任务?或者在线程池之外发生了事件?
我想在我的服务中保持我的全局线程限制。
答案 0 :(得分:1)
如果您只需要限制线程数以保护拒绝服务攻击,那么更好的选择是限制maxConcurrentCalls
的{{1}}属性。
请参阅http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.maxconcurrentcalls.aspx
默认情况下,此参数是处理器计数的16倍。
如果是这样,那么你可以避免限制线程池的最大线程数。
然后,您的WCF服务将从多个并发调用的角度来看是安全的,同时将立即处理定时器事件。
答案 1 :(得分:1)
如果有选项,您可以使用Taskfactory
结合阻止集合将代码转换为支持生产者 - 消费者模式。
该集合允许您设置最大限制。
从以下链接:
- An implementation of the Producer-Consumer pattern. - Concurrent adding and taking of items from multiple threads.
<强>&GT; - 可选的最大容量。
- Insertion and removal operations that block when collection is empty or full. - Insertion and removal "try" operations that do not block or that block up to a specified period of time. - Encapsulates any collection type that implements IProducerConsumerCollection(Of T) - Cancellation with cancellation tokens. - Two kinds of enumeration with foreach (For Each in Visual Basic): - Read-only enumeration. - Enumeration that removes items as they are enumerated.
以下是一些值得查看的资源:
blocking-collection-and-the-producer-consumer-problem
http://msdn.microsoft.com/en-us/library/dd997371.aspx
http://msdn.microsoft.com/en-us/library/dd267312.aspx
答案 2 :(得分:0)
这篇.NET Matters MSDN文章ThreadPoolPriority, and MethodImplAttribute有点旧,但我认为这种方法仍然有效。他的解决方案是创建一个ThreadPriorityPool,用于定义托管池中下一个可用线程应该执行的内容。
另一种选择是在CodeProject上尝试Smart Thread Pool。它明确支持按优先级排序工作项。