2010-11-22 68 views
2

我正在制作一个使用委托来处理WCF服务中的请求处理的多线程应用程序。我希望客户端能够发送请求,然后断开连接并等待回调来宣布工作已完成(这很可能是通过数据库搜索的)。我不知道一次可能会有多少请求,它可能每隔一段时间就会有一次,或者可能会达到几十次。在C#.Net中使用委托,当我用完.Net线程池中的线程时会发生什么?

据我所知,.Net的线程池有25个线程可供使用。当我派出25位或更多代表时会发生什么?它是否会抛出错误,是否等待,是否暂停现有操作并开始处理新委托或其他某些行为?

除此之外,如果我想在其他操作(例如传入/传出连接)想要启动时产生多达25个代表或者另一个操作正在工作并且我想产生另一个操作代表?

我想确保这是可扩展的,而不是太复杂。

感谢

+0

如果您使用WCF,那么您没有2.0的RTM版本的.NET。限制是250 x CPU核心数量。 – 2010-11-22 17:12:07

+0

我的意思是关注线程(以及我如何访问它们)是通过使用BeginInvoke的委托来调用通常的同步方法。性能瓶颈很可能是响应者客户端正在做它的事情(等待数据库搜索),然后可能会返回大量的数据以及将它通过互联网发送到中央代理服务所需的时间,然后返回给请求的客户。 – 2010-11-22 17:15:39

+0

我目前正在使用.Net 3.5进行开发,但如果看起来它提供了我的应用程序所需的功能/性能(特别是WCF),我可能会移至4.0。 – 2010-11-22 17:53:33

回答

4

所有的操作都在排队(我假设你是直接或间接使用线程池)。线程池的工作是通过队列和派遣操作到线程。最终所有线程都可能变得繁忙,这意味着队列将增长,直到线程可以开始处理排队的工作项目。

+0

我从指向方法的委托调用BeginInvoke。 (我对多线程的了解非常有限。上周我读了很多东西,并且知道如何以各种方式实现我的目标,但我并没有完全理解或理解这样做的含义,并且委托人似乎是使该过程异步的最简单方法)。 – 2010-11-22 17:17:17

1

如果您使用的是ThreadPool.QueueUserWorkItem,那么它只是排队多余的项目,直到线程可用。

3

你让代理人感到困惑,线程数和并发连接数。

使用WCF双向绑定,连接在等待回调期间保持打开状态。 现代硬件上的IIS 7或更高版本应该在维护几千个并发连接时没有困难,如果他们闲置。

代表只是方法指针 - 你可以拥有任意数量的代码。这并不意味着他们被同时调用。

1

ThreadPools默认最大线程数量是250而不是25!如果需要的话,您仍然可以为ThreadPool设置更高的限制。
如果您的ThreadPool用完线程,可能会发生以下两种情况:所有操作都会排队等待下一个资源可用。如果有完成的线程可能仍在“使用中”,GC将触发并释放其中一些线程,为您提供新的资源。
但是,您也可以创建不使用ThreadPool的线程。