我目前正在开发一个需要向实时进程发送和接收命令的C#套接字服务器。客户端是一个Android设备。目前,实时要求是“软”的,但是将来可能会出现更严格的时序要求。让我们说将来可能会向可能有潜在危险的起重机发送命令。
服务器正在运行,并且看起来非常适合我当前的同步套接字服务器设计。我有单独的线程来接收和发送数据。我想知道是否有任何理由尝试异步服务器套接字方法?它能提供更多的稳定性和/或更快的性能吗?
答案 0 :(得分:6)
我会掩饰实时的定义,并说异步套接字不会更快地使请求进程的主体,但会增加并发性(您可以在任何时间采取的请求数)。如果所有处理器都忙于处理某些事情,那么您将无法获得任何收益。这只会让您在处理器等待套接字接收内容的情况下获益。
只是关于实时的说明,如果您的实时要求类似于需要在x时间内保证响应,那么C#和.NET将不会给您这样的保证。然而,这取决于您当前和未来的“软”定义。可能会出现发生以获得良好的响应时间,但不要将其与真实的实时系统混淆。
答案 1 :(得分:1)
如果您怀疑应用程序中异步的有用性,那么您一定要阅读this。它让您清楚地了解异步解决方案可以为您的应用程序添加的内容
答案 2 :(得分:0)
我认为你不会获得更多的稳定性或更快的性能。如果它确实是一个“实时”系统,那么它应该是同步的。如果您能够“接近实时”并且存在长时间运行或昂贵的计算操作,那么您可以考虑使用异步方法。如果不需要,我不会增加复杂性。
答案 3 :(得分:0)
如果是实时,那么您绝对希望您的通信由队列支持,以便您可以在该队列上证明时态逻辑。这就是nio / io-completion-ports / async为您提供的。如果您正在使用同步编程,那么在将数据从RAM复制到网卡时会浪费CPU。
此外,这意味着您的服务器绝对是单线程的。即使使用异步,您也可以使用单个线程,但仍可以处理数千个请求。
例如,假设客户端想要执行DOS攻击。他会连接并发送一个字节的数据。您的应用程序现在将无法再接收该连接超时的进一步命令,这可能非常大。使用async,您可以确认SYN包,但您的代码不会等待完整传输。