System.Timer在单独的线程中运行并保持线程限制

时间:2012-11-22 15:12:49

标签: c# .net wcf timer threadpool

我想限制多线程WCF服务中的线程数。所以,我使用ThreadPool.SetMaxThread函数。现在,我想使用System.Timers以给定的时间间隔生成事件。

但是,我的服务同时收到许多要在线程池中执行的操作。当我的计时器结束时,操作在ThreadPool中排队(我有时会预期100,000个任务),因此执行起来很慢。

有没有办法在之前执行我过去的事件?例如,通过设置在线程池上排队的优先级任务?或者在线程池之外发生了事件?

我想在我的服务中保持我的全局线程限制。

3 个答案:

答案 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。它明确支持按优先级排序工作项。