我想限制我的多线程 WCF 服务中的线程数。所以,我使用ThreadPool.SetMaxThread
函数。现在,我想用System.Timers
给定的时间间隔生成事件。
但是,我的服务同时接收到许多要在线程池中执行的操作。当我的计时器用完时,该操作会在 ThreadPool 中排队(我有时期望有 100,000 个任务),因此执行速度很慢。
之前有没有办法执行我过去的事件?例如,通过设置线程池上排队的优先级任务?或者在线程池之外结束了事件?
我想在我的服务中保持我的全局线程限制。
我想限制我的多线程 WCF 服务中的线程数。所以,我使用ThreadPool.SetMaxThread
函数。现在,我想用System.Timers
给定的时间间隔生成事件。
但是,我的服务同时接收到许多要在线程池中执行的操作。当我的计时器用完时,该操作会在 ThreadPool 中排队(我有时期望有 100,000 个任务),因此执行速度很慢。
之前有没有办法执行我过去的事件?例如,通过设置线程池上排队的优先级任务?或者在线程池之外结束了事件?
我想在我的服务中保持我的全局线程限制。
如果可以选择,您可以通过Taskfactory
结合使用阻塞集合来转换您的代码以支持生产者-消费者模式。
该集合允许您设置最大限制。
从下面的链接:
- An implementation of the Producer-Consumer pattern. - Concurrent adding and taking of items from multiple threads.
> - 可选最大容量。
- 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.
以下是一些值得一试的资源:
阻塞收集和生产者消费者问题
http://msdn.microsoft.com/en-us/library/dd997371.aspx
http://msdn.microsoft.com/en-us/library/dd267312。 aspx
如果您只需要限制线程数来保护拒绝服务攻击,那么这里更好的选择是限制maxConcurrentCalls
. ServiceThrottlingBehavior
请参阅http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.maxconcurrentcalls.aspx上的详细信息
默认情况下,此参数是处理器计数的 16 倍。
如果是这样,那么您可以避免限制线程池的最大线程数。
然后从多个并发调用的角度来看,您的 WCF 服务将是安全的,同时将无延迟地处理计时器事件。
这篇 .NET Matters MSDN 文章ThreadPoolPriority 和 MethodImplAttribute 有点旧,但我认为该方法仍然有效。他的解决方案是创建一个 ThreadPriorityPool 来定义托管池中下一个可用线程应该执行的内容。
另一种选择是尝试 CodeProject 上的智能线程池。它明确支持按优先级排序工作项。