我刚刚注意到我们应用程序中的日志记录代码使用
streamWriter.Write(message);
而不是
await streamWriter.WriteAsync(message);
但是.Write
会像普通的异步操作一样实际阻塞当前线程吗?在大规模并发系统中,迁移到WriteAsync
会带来性能优势吗?
答案 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