C# 我应该在MemoryStream上使用异步I/O吗?

C# 我应该在MemoryStream上使用异步I/O吗?,c#,asynchronous,C#,Asynchronous,如果我知道我正在操作的流是MemoryStream,那么最好不要使用任何异步方法(CopyToAsync、ReadAsync等) Stephen的一条评论让我对我在服务器应用程序中使用的方法产生了怀疑,该应用程序应该能够处理许多并发请求 在该应用程序中,所有I/O都是异步完成的,因此不会浪费线程。然而,由于CopyToAsync f.i.在MemoryStream上似乎不是真正的异步,我想知道在MemoryStream上使用异步操作是否有任何好处,即使是在服务器应用程序中也是如此。好吧,如果您检

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

Stephen的一条评论让我对我在服务器应用程序中使用的方法产生了怀疑,该应用程序应该能够处理许多并发请求


在该应用程序中,所有I/O都是异步完成的,因此不会浪费线程。然而,由于CopyToAsync f.i.在MemoryStream上似乎不是真正的异步,我想知道在MemoryStream上使用异步操作是否有任何好处,即使是在服务器应用程序中也是如此。

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

CopyToAsync
是另一个beast。其他异步方法只在一个线程上工作,
CopyToAsync
在两个线程上工作。虽然源
MemoryStream
不能从异步中获益,但目标线程可以。当然,如果这两个流都是内存流,您将不会得到任何好处

因此,一般来说,
MemoryStream
只有在与其他流实现一致的情况下才有异步方法。但是,当您使用它时,不会出现任何明显的性能下降


另外,如果您需要使用
MemoryStream
获得良好的性能,最好避免重新分配、重新使用底层缓冲区等。但这与异步无关。

MemoryStream
在追求性能时是一种气味,因为它意味着内存被分配和复制,通常是不必要的。但是,如果代码始终是
异步的,则在使用它时不需要对其进行特殊处理——使用一系列
if(stream is MemoryStream)
检查几乎肯定不会提高实际性能,而不是完全消除内存流。当然,YMMV和分析应该告诉你更多。我已经分析过了,使用异步比使用直接同步慢。我最初认为使用异步,应用程序在高负载下会表现得更好,但由于memorystream的异步io不是真正的异步,我们所做的只是增加不必要的开销。所以我想知道在mem stream上使用CopyToAsync有什么好处如果你从一个内存流复制到另一个内存流,那就没有什么好处了。它只使用write并返回一个完整的。异步代码永远不会比同步代码快。但是,当线程池线程没有被等待占用时,可以完成更多的工作。您需要一种非常不同的测试来了解这一点,它必须测量整个put,而不是代码执行速度,并且重要的是机器要有足够的负载,以便能够很好地使用这些tp线程。内存流不可避免地会变慢,因为它不会释放线程。您可能应该为看到可测量的性能损失而有些烦恼,但请记住,任何低于15%的性能损失都不具有统计意义。@HansPassant我知道它会变得更慢,我知道使用异步代码可以获得什么,但由于在MemStreams上异步是“伪造的”,我想知道在这种情况下是否有什么好处?