C#System.IO.FileStream性能严重挂起(10秒)

C#System.IO.FileStream性能严重挂起(10秒),c#,file,io,filestream,C#,File,Io,Filestream,我遇到了这样一个问题:在执行文件写入操作时,会出现明显的(10秒以上)延迟。它似乎只发生一次,并且总是在第二次(有时是第三次)调用WriteToFile()函数时发生 我编写了3个不同的“WriteToFile”函数,以显示我迄今为止尝试过的一些变体,并在“OpenFileIfEssential”中显示了我尝试过的其他行 代码从不抛出错误,偏移量/计数都有效。一旦延迟发生一次,似乎就没有进一步的延迟了 这对我来说已经是两天多的痛苦了,我现在肯定需要第二种意见 private void W

我遇到了这样一个问题:在执行文件写入操作时,会出现明显的(10秒以上)延迟。它似乎只发生一次,并且总是在第二次(有时是第三次)调用WriteToFile()函数时发生

我编写了3个不同的“WriteToFile”函数,以显示我迄今为止尝试过的一些变体,并在“OpenFileIfEssential”中显示了我尝试过的其他行

代码从不抛出错误,偏移量/计数都有效。一旦延迟发生一次,似乎就没有进一步的延迟了

这对我来说已经是两天多的痛苦了,我现在肯定需要第二种意见

    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);                    
            }               
        }
    }
private void WriteToFile(字节[]数据,长偏移量,整数计数)
{
锁(这个监视器)
{
这个.openfileifrequired();

这个.fileStream.Seek(offset,SeekOrigin.Begin);//发现了这个问题。值得一提的是,我们以前一直在用较小的(发生这种情况是因为当您将文件位置设置为某个大值时,底层存储系统必须将分配块的内容归零。我不相信BCL会让您绕过这一点,但在Win32中确实有一种方法可以跳过需要运行程序才具有管理员权限的功能(以非常不精确的方式)


搜索SetFileValidData()文档。

尝试在不同的计算机上执行相同的操作。或者在安全模式下在同一台计算机上执行相同的操作,或者不使用常驻应用程序(如防病毒)。在将流刷新到文件之前,您试图写入多少数据?x otikoruk x-在延迟发生之前少于10k字节。在其他机器上,您可能会发现使用时性能更好。创建文件句柄时,需要进行一些P/调用,但这并不是很难做到。
fileStream.Seek(size - 1, SeekOrigin.Begin);
fileStream.WriteByte(0);
fileStream.Flush();