4

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

但是,我的服务同时接收到许多要在线程池中执行的操作。当我的计时器用完时,该操作会在 ThreadPool 中排队(我有时期望有 100,000 个任务),因此执行速度很慢。

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

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

4

3 回答 3

1

如果可以选择,您可以通过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

于 2012-11-22T20:43:39.450 回答
1

如果您只需要限制线程数来保护拒绝服务攻击,那么这里更好的选择是限制maxConcurrentCalls. ServiceThrottlingBehavior请参阅http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.maxconcurrentcalls.aspx上的详细信息

默认情况下,此参数是处理器计数的 16 倍。

如果是这样,那么您可以避免限制线程池的最大线程数。

然后从多个并发调用的角度来看,您的 WCF 服务将是安全的,同时将无延迟地处理计时器事件。

于 2012-11-22T16:00:46.813 回答
0

这篇 .NET Matters MSDN 文章ThreadPoolPriority 和 MethodImplAttribute 有点旧,但我认为该方法仍然有效。他的解决方案是创建一个 ThreadPriorityPool 来定义托管池中下一个可用线程应该执行的内容。

另一种选择是尝试 CodeProject 上的智能线程池。它明确支持按优先级排序工作项。

于 2012-11-23T07:02:49.090 回答