.NET相当于Java NIO Selector

时间:2009-07-25 05:51:08

标签: c# .net

我知道.NET有一个很好的网络I / O异步模型,它使用了底层的完成端口。但所有回调都发生在来自线程池的IO线程上。

是否有像Java的选择器这样的.NET对应物在单个线程中处理多个流?或者,线程池回调比这个单线程方法更好地扩展?

谢谢,

杜德

2 个答案:

答案 0 :(得分:2)

对于异步操作,IO句柄与线程池相关联。当异步操作完成时,我相信回调(对于每个流)可能会也可能不会使用相同的线程执行,任何可用的线程池线程都可以处理回调,很可能同一个线程可以处理多个回调或只有一个基于运行时条件的回调。

希望这有帮助

编辑:添加对Dodd评论的回复

我并不熟悉Selector API,但是通过查看发布的here示例,似乎Selector会等到所有事件发生。真的吗?如果是这样,那么即使一个事件比另一个事件发生得更早,调用者也必须等待所有事件发生。 但是如果Selector一旦发生事件就会处理事件,那么可能会遇到一个情况,即当一个事件到达时,选择器正在处理一个事件的回调(我想在这种情况下,传入的事件会在某处排队)否则你会丢弃事件)但是当事件正交时它仍会降低吞吐量,并且应该在事件发生时立即处理。

.NET中的异步模型以线程池为中心,以减少创建新线程的开销(因为这是一项昂贵的操作)。如果您观察到线程池最大化,则可以将池中的线程数增加为documented。但请记住,在一天结束时,您只能使用处理器数量,即在双核盒上只有2个线程可以正在运行,所有其他线程都被阻止,因此可能需要考虑。

希望这有帮助。

答案 1 :(得分:0)

感谢Abhijeet,

好吧,我担心的是,在一些非常繁忙的情况下,许多异步回调同时发生,而且我们的线程用完了:然后上下文切换将成为噩梦。在这种特殊情况下,异步回调是正确的选择吗?或者我们应该使用Select()?