【发布时间】:2017-07-29 23:41:55
【问题描述】:
我遇到了一个问题,即在执行文件写入操作时出现明显的(10 多秒)延迟。它似乎只发生一次,并且总是在第二次(有时是第三次?)调用 WriteToFile() 函数期间发生。
我已经写出了 3 个不同的“WriteToFile”函数来展示我迄今为止尝试过的一些变体 + 在“OpenFileIfNecessary”中显示了我尝试过的其他行。
代码永远不会抛出错误,并且偏移量/计数都是有效的。一旦延迟发生一次,似乎就不会再有延迟了。
这对我来说已经痛苦了 2 多天了,我肯定正处于需要第二意见的时候。
private void WriteToFile(byte[] data, long offset, int count)
{
lock (this.monitor)
{
this.OpenFileIfNecessary();
this.fileStream.Seek(offset, SeekOrigin.Begin); // <- Takes 10+ seconds for THIS line to execute
this.fileStream.Write(data, 0, count);
}
}
private void WriteToFile2(byte[] data, long offset, int count)
{
lock (this.monitor)
{
this.OpenFileIfNecessary();
this.fileStream.Position = offset; // <- Takes 10+ seconds for THIS line to execute
this.fileStream.Write(data, 0, count);
}
}
private void WriteToFile3(byte[] data, long offset, int count)
{
lock (this.monitor)
{
var fileName = this.file.FullName;
using (Stream fileStream = new FileStream(fileName, FileMode.OpenOrCreate))
{
fileStream.Position = offset; //(instant execution of this line)
fileStream.Write(data, 0, count);
//Getting from HERE ->
}
//To HERE <- takes 10+ seconds
}
}
private System.IO.FileStream fileStream = null;
private System.IO.FileInfo file; //value set during construction
private void OpenFileIfNecessary()
{
lock (this.monitor) {
if (this.fileStream == null) {
//The following 3 lines all result in the same behavior described in this post
//this.fileStream = this.file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
//this.fileStream = this.file.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
//this.fileStream = this.file.OpenWrite();
this.fileStream = this.file.Open(FileMode.OpenOrCreate);
}
}
}
【问题讨论】:
-
尝试在不同的计算机上做同样的事情。或者在同一台计算机上处于安全模式,或者没有一些常驻应用程序(如防病毒)。
-
在将流刷新到文件之前,您尝试将多少数据写入流?
-
x otikoruk x - 延迟发生前小于 10k 字节
-
辩证法在其他机器上的行为相同
标签: c# file io filestream