我应该在内存流上使用异步I / O吗?

时间:2017-11-14 08:36:15

标签: c# asynchronous

如果我知道我正在操作的流是MemoryStream,那么不使用任何异步方法(CopyToAsync,ReadAsync等等)会更好吗?

Stephen Clearly对this SO question的评论使我怀疑我在应该能够处理许多并发请求的服务器应用程序中使用的方法。

在该应用程序中,所有I / O都是异步完成的,因此不会浪费任何线程。但是,因为它似乎是CopyToAsync f.i.在MemoryStream上实际上并不是异步,我想知道我是否有任何好处 - 即使在服务器应用程序中 - 在MemoryStream上使用异步操作。

1 个答案:

答案 0 :(得分:5)

好吧,如果您检查MemoryStream实施,您会发现ReadAsync(和WriteAsync)实际上是同步的,而不使用任何其他线程。虽然有一些开销,但它很小,应该可以忽略不计。

CopyToAsync是一个不同的野兽。虽然其他异步方法仅适用于一个线程,但CopyToAsync适用于两个。虽然您的源MemoryStream无法从异步中受益,但目标线程可以。当然,如果两个流都是内存流,那么你将无法获得任何好处。

因此,回答一般问题,MemoryStream只有异步方法才能与其他流实现保持一致。但是在使用它时,性能不会下降。

P.S。如果你需要MemoryStream的良好性能,最好避免重新分配,重用底层缓冲区等等。但它与异步无关的主题不同。