使用BeginAccept与使用TcpListener阻塞Accept的专用线程相比,我获得了什么好处?

本文关键字:获得了 什么 线程 专用线 BeginAccept TcpListener 阻塞 专用 Accept 使用 | 更新日期: 2023-09-27 18:01:51

我一直在想,如果我能从使用BeginAccept获得任何可扩展性的好处,而不是仅仅在一个等待连接的专用线程中阻塞。显然,各个客户端将使用BeginXXX/EndXXX对来利用IOCP进行网络IO,但我认为等待客户端连接应该具有非常低的延迟。我计划创建一个Task来处理传入的连接,这样在Accept完成后,我的后续代码就不会阻塞主Accept线程很长时间(足够长,可以创建一个Task对象),并且我可以直接阻塞新连接。这几乎就是我对BeginAccept/EndAccept所做的,只是没有管理异步调用的复杂性。

所以,我的问题是,如果有的话,我通过使用IOCP接受可扩展性的好处是什么?请注意,这不是用于在单个客户端套接字上发送/接收,而只是用于接受服务器侦听套接字上的连接。

使用BeginAccept与使用TcpListener阻塞Accept的专用线程相比,我获得了什么好处?

如果您只监听一个端口,那么可能不值得这样做——就像如果您一次只需要处理几个连接一样,您可能不会使用异步操作来处理这些连接。

服务器端异步的好处通常是当你扩展时——对于处理连接,它是当你有很多连接时;对于BeginAccept,它是当你监听许多不同的端口时。这可能比较罕见,但如果你曾经想要监听100个不同的端口(例如,如果你在一台服务器上托管了很多网站,出于某种原因想要监听不同的端口,而不是使用主机头),那么你不希望100个线程坐在一起只是消耗堆栈空间。