我定期将数据保存到文件中(每次打开和关闭文件),我想使用Stopwatch
测量文件操作所花费的时间。
我应该将Close()
花费的测量时间包括在内吗?
我们的软件有问题,我怀疑文件操作,例如硬盘繁忙或某种故障可能会导致延迟。在这种情况下调用Close()
会导致延迟(阻塞)吗?还是Close()
是一种非阻塞方法(但在它之后,framework/winapi文件内部的某个地方正在从写缓冲区等中刷新)?
或者Write()
在出现故障时可能会变慢?我不知道如何模拟磁盘问题来快速测试会发生什么。
首先,FileStream
的文档建议调用Dispose
而不是Close
。检查参考源,Close
所做的就是:
Dispose(true);
GC.SuppressFinalize(this);
在这种情况下调用Close()会导致延迟(阻塞)还是Close()是一个非阻塞方法(但在内部深处framework/winapi文件正在从写缓冲区中刷新,等等它)?
Close
调用Dispose
,它做两件事:
- 关闭文件句柄
- 将所有挂起的写入刷新到磁盘(默认情况下,写入是缓冲的)
当然,"将任何挂起的写操作刷新到磁盘"的意思是,告诉操作系统"将所有挂起的写入操作刷新到硬盘"。操作系统根据各种因素处理不同(例如,USB驱动器的写入速度往往不那么慢,临时文件可能永远不会刷新到磁盘)。