我正在用 C# 开发一个应用程序,其中有一个服务器和一些客户端(不超过 60 个),我希望能够独立处理每个客户端。服务器和客户端之间的通信很简单,但我必须等待一些确认,我不想阻止任何查询。
到目前为止,我已经完成了两个版本的服务器端,一个是基于此:
http://aviadezra.blogspot.com.es/2008/07/code-sample-net-sockets-multiple.html
而在另一个中,我基本上为每个客户创建了一个新线程。两个版本都可以正常工作...但我想知道这两种方法的优缺点。
在这种情况下有什么编程模式可以遵循吗?
最佳答案
要回答您的问题,两者都是。您有线程和在这些线程中运行的类。无论您使用 WCF、异步、套接字还是其他任何东西,您都将在线程中运行某个对象(或者像使用异步一样在线程池中随机运行)。使用 WCF,您可以 c onfigure the concurrency model ,如果您必须等待 ack 或其他确认,您最好将其设置为多线程,这样您就不会阻止其他请求。
在您链接到作者的示例中,使用 AsyncCallback
作为告诉您套接字有数据的机制。但是,来自 MSDN你可以看到:
Use an AsyncCallback delegate to process the results of an asynchronous operation in a separate thread
所以对于小型应用程序来说,这真的没有什么不同。像这样使用异步可以帮助您避免为每个线程分配堆栈空间,如果您要执行大型应用程序,这很重要。但对于一个小应用程序,我认为它只会增加复杂性。 C# 4.5+ 和 F# 在异步方面做得更干净,所以如果您可以使用类似的东西,那么也许可以使用它。
按照您的方式进行操作,您有一个线程负责套接字管理。它会坐下来接受新的连接。当它收到请求时,它将那个套接字交给一个新的专用线程,然后该线程将驻留在该套接字上并从中读取。该线程是您的客户端连接。我喜欢将套接字客户端读取封装到一个基类中,该基类可以执行所需的低级别 io,然后充当请求的路由器。 IE。当我收到请求 XYZ 时,我会请求 ABC。您甚至可以让它分派(dispatch)事件并在其他地方订阅这些事件(如在异步示例中)。现在您已经将客户端逻辑与套接字读取逻辑分离。
如果您使用 WCF 执行操作,则不需要套接字和所有额外处理,但您仍应注意调用是多线程的,并在适用时正确同步您的应用程序。
对于 60 位客户,我认为您应该选择最适合您的。 WCF 易于设置和使用,我会使用它,但套接字也很好。如果您担心运行的线程数,请不要担心。虽然运行太多线程是不好的,但大多数线程在等待 IO 时实际上会被阻塞。处于等待状态的线程不是由操作系统调度的,因此并不重要。更不用说等待很可能是在引擎盖下使用 io 完成端口,因此等待开销对于像您这样的小型应用程序来说几乎可以忽略不计。
最后,我会选择最容易编写、维护和扩展的内容。
关于c# - 一台服务器许多客户端 : Threads or classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13261625/