Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# .NET客户端/服务器可扩展性和异步I/O-线程过剩问题_C#_.net_Asynchronous_Scalability_Client Server - Fatal编程技术网

C# .NET客户端/服务器可扩展性和异步I/O-线程过剩问题

C# .NET客户端/服务器可扩展性和异步I/O-线程过剩问题,c#,.net,asynchronous,scalability,client-server,C#,.net,Asynchronous,Scalability,Client Server,我有一个非常简单的问题,也许熟悉服务器/客户机设计的人可以很快回答这个问题 我正在编写一个服务器端应用程序,该应用程序设计为在相对不复杂的硬件上运行,读:不太现代,普通的办公桌面PC,但可以容纳相当多的用户,尽管有些用户可能空闲-因此,我担心的是,由于过度的上下文切换,每个客户端都有一个线程,这会对可伸缩性产生影响,从而导致机器停止运行。当然,这需要仔细考虑何时真正应该生成线程 我考虑过的一个解决方案是在服务器应用程序中使用一个独立于连接侦听器线程的主线程,该线程通过定期查看打开的套接字列表并执

我有一个非常简单的问题,也许熟悉服务器/客户机设计的人可以很快回答这个问题

我正在编写一个服务器端应用程序,该应用程序设计为在相对不复杂的硬件上运行,读:不太现代,普通的办公桌面PC,但可以容纳相当多的用户,尽管有些用户可能空闲-因此,我担心的是,由于过度的上下文切换,每个客户端都有一个线程,这会对可伸缩性产生影响,从而导致机器停止运行。当然,这需要仔细考虑何时真正应该生成线程

我考虑过的一个解决方案是在服务器应用程序中使用一个独立于连接侦听器线程的主线程,该线程通过定期查看打开的套接字列表并执行选择操作来跟踪打开的连接上的活动。。。在每一页上。如果线程找到传入数据,它将设置异步读取以使用消息,处理消息并返回回复(如果需要),然后移动到下一个套接字。无论服务器至少在客户端上连接了多长时间,此过程都会重复

在这样做时,实际运行的线程的最大数量仅限于实际通信的客户端数量,并且不高于连接的最大用户数量;对于空闲的客户机,没有空闲线程会占用CPU并使机器陷入困境-线程与客户机关联的唯一时间是当有实际数据要接收和处理时

在我看来,这是有道理的,尽管我想这是我第一次在C中尝试这种方式。有人对这可能带来的任何问题有什么想法,或者对更好地完成同样任务有什么建议吗


谢谢

< P>一种方法,你可能要考虑的是使用一个池为你的应用程序提供可用的线程。 这种方法与您正在考虑的不同之处在于,您的服务器可以同时处理固定数量的线程,超过该数量后收到的任何请求都将排队,直到另一个工作线程可用为止


实际上,这就是ASP.NET用于传入HTTP请求的方式。

您考虑过使用WCF吗?如果您担心上下文切换会占用cpu,那么最好使用调用关闭方法。WCF可以大大简化您的客户机-服务器通信,因为您甚至不必担心套接字编程。它还提供了各种现成的通信选项,包括HTTP、TCP、仅在同一台机器上命名的管道和MSMQ

根据客户端和服务器之间对话的具体工作方式,您可以使用MSMQ和发布/订阅消息,这将允许客户端异步发送消息并获得异步回复。这将扩展到几乎任何负载。如果您有状态对话,WCF也支持此功能,并且如果服务器需要回拨到客户端,双工通道可用于双向、多消息对话

WCF将为您处理线程、队列和资源管理,使您能够专注于关键业务行为。至于吞吐量,我最近使用一个超级基本的计算器服务add、sub、mul、div方法对WCF进行了一个简单的原始性能测试,基本上没有行为开销。在我工作的开发人员工作站上,一个Core2Duo和两个gigs的ram,我们实现了每秒30000次的调用,其他四台开发人员机器也在进行调用。相比之下,作为一台更现代的机器,我的家庭系统有一个核心i7 920 8逻辑核心、12千兆ram和千兆以太网,我甚至不能用其他4个系统使管道或CPU饱和,每秒实现近100000次呼叫。如果我能设法使管道和/或cpu饱和,我甚至无法想象原始吞吐量

我认为这是一个强有力的迹象,表明WCF本身的开销低得离谱,即使在较旧的硬件上,也不会给您带来问题


我极力推荐。开发和维护自定义通信基础设施可以为您节省大量时间。

请不要损坏您的帖子。SO上的内容也适用于未来用户。