StreamWriter.Write是否会阻塞当前线程?

时间:2019-01-03 09:18:23

标签: c# async-await

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

streamWriter.Write(message);

而不是

await streamWriter.WriteAsync(message);

但是.Write会像普通的异步操作一样实际阻塞当前线程吗?在大规模并发系统中,迁移到WriteAsync会带来性能优势吗?

2 个答案:

答案 0 :(得分:1)

StreamWriter是否将阻止取决于它正在将其数据写入哪个Stream。如果您查看source code of StreamWriter,您会发现Write仅将数据添加到其内部缓冲区,并在该缓冲区已满时将其刷新到Stream。

该流会将数据复制到其内部缓冲区,并在该缓冲区已满时将其刷新。刷新将进行实际保存。

如果Stream是MemoryStream,则Flush不会花费很多,但是如果它写入文件,则可能需要一些时间。

总而言之,您会看到所有涉及的缓冲区。 Stream和StreamWriter概念的设计者已经考虑在发明async-await之前改善响应时间。

可能要进行实际写入的设备驱动程序也具有某种缓冲机制,以防止写入器不得不等待数据实际写入硬盘。

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

答案 1 :(得分:0)

是的,最好使用WrtieAsync,因为WriteAsync方法使您能够执行资源密集型I / O操作而不会阻塞主线程。

在Windows 8.x商店应用程序或台式机应用程序中,这种性能考虑因素尤其重要,在这些应用程序中,耗时的流操作可能会阻塞UI线程并使您的应用程序看起来好像无法运行。异步方法与Visual Basic和C#中的async和await关键字一起使用。

https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.writeasync?view=netframework-4.7.2