Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与使用TcpListener阻止Accept的专用线程相比,使用beginacept有什么好处?_C#_Sockets_Asynchronous - Fatal编程技术网

C# 与使用TcpListener阻止Accept的专用线程相比,使用beginacept有什么好处?

C# 与使用TcpListener阻止Accept的专用线程相比,使用beginacept有什么好处?,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我试着想想,使用BeginAccept与只阻塞一个等待连接的专用线程相比,是否能获得任何可伸缩性好处。显然,各个客户端将使用BeginXXX/EndXXX对来利用IOCP进行网络IO,但我认为等待客户端连接应该具有非常低的延迟。我计划创建一个任务来处理传入的连接,这样在接受完成后,我的后续代码不会阻塞主接受线程很长时间(足够长的时间来创建一个任务对象),我可以直接返回阻塞新连接。这与我使用beginacept/EndAccept时所做的差不多,而不需要管理异步调用的复杂性 所以,我的问题是,使用

我试着想想,使用BeginAccept与只阻塞一个等待连接的专用线程相比,是否能获得任何可伸缩性好处。显然,各个客户端将使用BeginXXX/EndXXX对来利用IOCP进行网络IO,但我认为等待客户端连接应该具有非常低的延迟。我计划创建一个任务来处理传入的连接,这样在接受完成后,我的后续代码不会阻塞主接受线程很长时间(足够长的时间来创建一个任务对象),我可以直接返回阻塞新连接。这与我使用beginacept/EndAccept时所做的差不多,而不需要管理异步调用的复杂性


所以,我的问题是,使用IOCP for accept可以获得什么(如果有的话)可伸缩性好处?请注意,这不是用于在单个客户端套接字上发送/接收,而是用于在服务器侦听套接字上接受连接。

如果您只有一个正在侦听的端口,那么这可能不值得—就像您一次只需要处理几个连接一样,您可能不会费心使用异步操作来处理这些问题


异步的服务器端好处通常是当您进行扩展时——为了处理连接,当您获得大量连接时;对于
beginacept
来说,当您在许多不同的端口上进行监听时。这可能比较少见,但如果您确实希望侦听100个不同的端口(例如,如果您在一台服务器上托管了许多网站,并且出于某种原因希望只侦听不同的端口,而不使用主机头)然后,您就不希望100个线程只占用堆栈空间。

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


异步的服务器端好处通常是当您进行扩展时——为了处理连接,当您获得大量连接时;对于
beginacept
来说,当您在许多不同的端口上进行监听时。这可能更罕见,但如果你真的想监听100个不同的端口(例如,如果你在一台服务器上托管了很多网站,出于某种原因只想监听不同的端口,而不是使用主机头),那么你就不想让100个线程只占用堆栈空间。

如果你的应用程序想监听100个端口,你想为100个线程浪费100MB的内存来阻止等待连接吗?@JonSkeet有趣的一点是,如果你的应用程序正在监听100个端口,你可能首先应该重新考虑你的应用程序的设计:你只能监听1个端口,然后在接受传入连接后重新使用它(再次监听)。就像web服务器在80端口上所做的那样。@AgentFire:不,我的意思是真正在多个端口上侦听-不同的数字。@Jon不确定这是从哪里得到的,但我有一个线程阻止了accept。它是一个单线程,而不是多个线程在多个端口上侦听-这太疯狂了。我也没有为每个客户机旋转线程,而是使用BeginXXX/EndXXX IOCP调用。我的问题是,BeginAccept和blocking Accept对IOCP有什么好处?另外,用另一个问题回答一个问题也不是很有帮助。如果你的应用程序想要监听100个端口,你想浪费100MB内存让100个线程仅仅阻塞等待连接吗?@JonSkeet interest point,但是,如果你的应用程序正在侦听100个端口,那么你可能首先应该重新考虑应用程序的设计:在接受传入连接后,你只能侦听1个端口并重新使用它(再次侦听)。就像web服务器在80端口上所做的那样。@AgentFire:不,我的意思是真正在多个端口上侦听-不同的数字。@Jon不确定这是从哪里得到的,但我有一个线程阻止了accept。它是一个单线程,而不是多个线程在多个端口上侦听-这太疯狂了。我也没有为每个客户机旋转线程,而是使用BeginXXX/EndXXX IOCP调用。我的问题是,BeginAccept和blocking Accept对IOCP有什么好处?另外,用另一个问题回答一个问题也不是很有帮助。