TCP套接字连接中同步与异步的优点

Mo *_* H. 7 c# sockets asynchronous synchronous

我目前正在学习来自java背景的C#.为了让我的脚湿透,我决定制作一个简单的SMTP邮件应用程序.我很快就了解到C#提供了对同步和异步套接字的支持.

从我所看到的,使用同步套接字与异步套接字没有任何实际优势,因为后者不会阻塞,因此每次都不需要创建新线程.使用一个或另一个似乎也没有明显的开销.

所以我的问题是,使用同步套接字是否有优势,或者在大多数情况下坚持使用异步更好?

usr*_*usr 9

Async IO保存线程.线程消耗(通常)1MB的堆栈内存.当并发未完成的IO操作数量变大时,这是使用异步IO的主要原因.根据我的测量,在您进入数千个线程之前,OS可扩展性不是问题.

主要缺点是需要更多的开发工作才能使相同的应用程序以相同的可靠性水平工作.

我已经详细介绍了这种权衡.另外:我们应该默认切换到使用异步I/O吗?

建议始终使用异步IO是客观错误的建议.


Pet*_*iho 7

这两种机制都有效.主要区别在于,同步意味着阻止一个线程,否则该线程将执行其他有用的操作,或者将线程专用于每个连接.无论哪种方式,这都不能很好地扩展.对于只有少量或只有一个活动连接的简单应用程序,它可能没问题.

但是对于需要处理大量并发连接的任何场景,异步API是唯一能够提供足够性能的API.此外,在任何交互式场景中(即您必须处理用户输入和输出),异步方法更容易与用户界面集成.现在我们拥有asyncawait使用C#尤其如此.