C# StreamWriter.Write是否阻止当前线程?

C# StreamWriter.Write是否阻止当前线程?,c#,async-await,C#,Async Await,我刚刚注意到,我们应用程序中的日志代码使用 streamWriter.Write(message); 而不是 await streamWriter.WriteAsync(message); 但是.Write会像正常的异步操作那样实际阻止当前线程吗?在一个大规模并发系统中,迁移到WriteAsync会带来性能上的好处吗?是的,迁移到wrtieAync更好,因为WriteAsync方法使您能够在不阻塞主线程的情况下执行资源密集型I/O操作 在Windows 8.x应用商店应用程序或桌面应用程序中

我刚刚注意到,我们应用程序中的日志代码使用

streamWriter.Write(message);
而不是

await streamWriter.WriteAsync(message);

但是
.Write
会像正常的异步操作那样实际阻止当前线程吗?在一个大规模并发系统中,迁移到
WriteAsync
会带来性能上的好处吗?

是的,迁移到wrtieAync更好,因为WriteAsync方法使您能够在不阻塞主线程的情况下执行资源密集型I/O操作

在Windows 8.x应用商店应用程序或桌面应用程序中,此性能考虑尤其重要,因为耗时的流操作可能会阻止UI线程,并使应用程序看起来好像不工作。async方法与Visual Basic和C#中的async和await关键字结合使用


StreamWriter是否将阻塞取决于它将数据写入的流。如果查看,您将看到写入操作只会将数据添加到其内部缓冲区,并在该缓冲区已满时将其刷新到流中

流将把数据复制到它的内部缓冲区,当缓冲区满时,它将被刷新。冲洗将进行实际的保存

如果流是MemoryStream,那么Flush不会花费太多,但是如果它写入文件,那么可能需要一些时间

总之,您可以看到所有涉及的缓冲区。Stream和StreamWriter概念的设计者在异步等待发明之前就已经考虑过如何改进响应时间

可能进行实际写入的设备驱动程序也有一些缓冲机制,以防止写入程序必须等待数据实际写入硬盘


理论上,如果StreamWriter已满,并将数据刷新到已满的流,将数据刷新到磁盘缓冲区,磁盘缓冲区已满,必须等待数据实际写入,则您将获得处理时间。然而,我怀疑这种情况是否经常发生。

不,最有可能的结果是性能将大大恶化。操作系统不需要您的帮助,文件写入已经通过文件系统缓存实现了异步。最重要的是,你永远不会知道。如果应用程序不是为此而设计的,那么你不能对任何记录某些内容的方法使用async。如果您想进行实验,那么让您的记录器库异步,这样您就不必对现有代码做可怕的事情。