Await/Async or SocketAsyncEventArgs?
本文关键字:SocketAsyncEventArgs or Async Await | 更新日期: 2023-09-27 17:58:54
所以我已经准备好用SocketAsyncEventArgs
和socket.***异步方法编写了一个tcp服务器。但我确实喜欢使用Stream.ReadAsync
和Stream.WriteAsync
方法编写代码的await/async
方式。
性能/内存方面有什么不同吗?还是我只是在语法上有所不同?
使用socketasynceventargs的优点是减少垃圾收集器的压力,并将套接字的缓冲区分组以防止内存不足异常。
通过使用SocketAsyncEventArgs池,您可以消除为每次读写调用创建和收集IAsyncResult的需要。
其次,可以为每个SocketAsyncEventArgs分配一个大字节[]块的一部分。这样可以防止内存碎片,从而有助于减少内存占用。尽管从技术上讲,这也可以通过Begin/End调用来完成,但更容易的是永久地为每个SocketAsyncEventArgs分配自己的缓冲区,而不是每次使用Begin/Eend方法调用读或写时都分配一个块。
最后一个重要的区别是,根据MSDN Library的说法,Begin/End Send方法可能会在套接字缓冲区已满时阻塞。SocketAsyncEventArgs不会阻塞,相反,根据套接字缓冲区中的空间大小,只会写入一定数量的字节,回调将指定写入的字节数。
除非是边缘案例,否则这些优势实际上并不明显。除非您遇到指定的任何一个问题,否则我建议您选择最舒适、最可维护的问题。