[将File_FLAG_NO_BUFFERING与FileStream一起使用会引发错误“参数不正确?

问题描述 投票:-1回答:1

我想将FILE_FLAG_NO_BUFFERING与FileStream一起使用,我对此进行了搜索并发现了这个问题[此处]:Reading a file with FileStream and FILE_FLAG_NO_BUFFERING

但是我听不懂(扇区大小)之类的词,无论如何,我之前都问过这个问题[]:FileStream.ReadAsync blocks UI if useAsync is true, but doesn't block UI if it's false

并且我在示例中回答了我的问题的代码

这是代码:

private async void button1_Click(object sender, EventArgs e)
    {
        FileOptions options = checkBox1.Checked ?
        FileOptions.Asynchronous | (checkBox2.Checked ? (FileOptions)0x20000000 : FileOptions.None) :
        FileOptions.None;
        string _tempFileName = @"C:\Users\iP\Documents\Visual Studio 2015\Projects\ConsoleApplication32\ConsoleApplication32\bin\Debug\hello.txt";
        int x = 32 * 1024; // the buffer size 
        using (Stream stream = new FileStream(_tempFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous|(FileOptions)0x20000000))
        {
            await _ReadAsync(stream, x ); // passing it to function
        }



        textBox1.Text = ";olkncdd";
    }
    private async Task _ReadAsync(Stream stream, int bufferSize)
    {
        byte[] data = new byte[bufferSize];



        while (await stream.ReadAsync(data, 0, data.Length) > 0)
        {
            // empty loop
            textBox1.AppendText("it is reading");
        }
        // when While loop finish i get error " the parametere is incorrect " 
    }

我在while循环结束时收到错误(此错误与任何缓冲区大小有关)错误

mscorlib.dll中发生'System.IO.IOException类型的异常,但未在用户代码中处理

其他信息:参数不正确。

仅当我仅使用FILE_FLAG_NO_BUFFERING时,才会出现此错误

有人可以帮助我吗?

谢谢:)

c# filestream
1个回答
0
投票
虽然您未指定例外,但最有可能是ArgumentException:“偏移量和计数之和大于缓冲区长度。” -https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync

但是使用多任务处理,任何可以设想的和几个

无法想象的代码段都会在竞态条件上引发此异常。就在最近,我们List<T>.AddRange()从他的调用堆栈的深处抛出了一个异常-因为在增长后端列表和复制新值之间存在竞争。这是官方示例代码:

using (FileStream SourceStream = File.Open(filename, FileMode.Open)) { result = new byte[SourceStream.Length]; await SourceStream.ReadAsync(result, 0, (int)SourceStream.Length); }

注意,结果是根据剩余长度(而不是固定数量)初始化的。他们试图一次全部得到。在这种情况下,“缓冲区”实际上可能是用词不当。
© www.soinside.com 2019 - 2024. All rights reserved.