流刷新与FlushAsync
本文关键字:FlushAsync 刷新 | 更新日期: 2023-09-27 18:00:25
除了Flush()方法,我注意到Stream类还有一个FlushAsync()方法。在什么情况下,您会使用FlushAsync()方法?刷新缓冲区的成本是否高到可以保证异步运行?
是的,它可能非常昂贵,因为它实际上可能会将数据写入底层介质。
这些条件中的任何一个都可能成立:
- 您有很多数据要写(根据缓冲区大小)
- 媒体本身可能相当慢(网络或接口较慢的设备)
- 中间可能有几层抽象,它们将在有效写入之前进行进一步处理(例如压缩/加密抽象)
它可能与任何其他写入操作一样昂贵,然后有Async
版本(此外,它将有助于API的一致性)。
FlushAsync()
是如何实现的……一个实现细节,它可能是线程池中的简单Task
,也可能是更复杂的东西(异步I/O可能涉及操作系统本身)。它甚至可能是同步的(假设要刷新MemoryStream
,它没有任何缓冲区)。
根据我收集的信息,调用stream.Write()
可能会也可能不会在将数据卸载到目标目的地之前将数据放入内存缓冲区的中间位置。发生这种情况时,stream.Write()
会在实际写入所有数据之前解除锁定。
stream.Flush()
的作用是阻止程序,直到中间缓冲区被清除。根据数据的传输速度和大小,您可能希望异步Flush()
。