2

所以我已经用SocketAsyncEventArgssocket.***Async 方法编写了一个 tcp-server。但我确实喜欢使用and方法await/async编写代码的方式。Stream.ReadAsyncStream.WriteAsync

在性能/内存方面有什么不同,还是我只是在语法上有所不同?

4

1 回答 1

2

使用 socketasynceventargs 的优点是减少垃圾收集器的压力,并将套接字的缓冲区分组以防止内存不足异常。

通过使用 SocketAsyncEventArgs 池,您无需为每次读取和写入调用创建和收集 IAsyncResult。

其次,可以为每个 SocketAsyncEventArgs 分配一个大字节 [] 块的一部分。这可以防止内存碎片,从而有助于减少内存占用。虽然这在技术上也可以通过 Begin/End 调用来完成,但更容易为每个 SocketAsyncEventArgs 永久分配其自己的缓冲区,而不是每次使用 Begin/End 方法调用读取或写入时分配一个块。

最后一个可能很重要的区别是,根据 MSDN 库,当套接字缓冲区已满时,Begin/End Send 方法可能会阻塞。SocketAsyncEventArgs 不会阻塞,而是根据套接字缓冲区中的空间量仅写入一定数量的字节,回调将指定写入的字节数。

除非是边缘情况,否则优势实际上并不明显。除非您遇到指定的任何一个问题,否则我建议您选择最适合您且可维护的问题。

于 2013-03-08T07:46:46.370 回答