调用BeginWrite时对缓冲区的更改

本文关键字:缓冲区 BeginWrite 调用 | 更新日期: 2023-09-27 18:25:20

我很好奇在BeginWrite真正完成写入之前对byte[]进行更改是否会影响FileStream最终写入的内容。

下面是我的代码,currentPage是我要写的数据的字节[]。

try
{
FileStream.BeginWrite(currentPage, 0, currentPage.Length, new AsyncCallback(EndWriteCallback),new State(logFile.fs, currentPage, BUFFER_SIZE, manualEvent));
manualEvent.WaitOne();
}
catch (Exception e)
{
  //handle exception here
}

我在一个循环中有这个,它将替换currentPage中的数据。如果我对currentPage进行更改(比如分配一个新的字节[],其中包含所有0),会发生什么?FileStream是缓冲要写入的字节[],还是实际上只是引用我调用它时传入的字节[]?

我试着看MSDN的文章,但我能找到的只有

多个同时发生的异步请求使得请求完成顺序不确定。

有人能给我解释一下吗?

调用BeginWrite时对缓冲区的更改

此代码应该可以回答您的问题。首先,我创建了一个长字节数组,其中每个单元格都等于255。然后我开始两个线程。第一个负责将准备好的字节数组写入文件。同时,第二个线程修改这个数组,从最后一个单元格开始,将每个单元格设置为0。

执行此代码的确切结果将取决于机器、当前CPU使用情况等。有一次,在我的计算机上,我观察到大约77%的创建文件包含255秒,其余为0秒。下一次大约是70%。它确认输入数组未被BeginWrite方法阻止写入。

为了观察这种效果,请尝试运行此程序几次。可能还需要使用较长的数组。

var path = @"C:'Temp'temp.txt";
var list = new List<byte>();
for(var  i = 0; i < 1000000; ++i)
    list.Add(255);
var buffer = list.ToArray();
var t1 = Task.Factory.StartNew(() =>
{
    using (var fs = File.OpenWrite(path))
    {
        var res = fs.BeginWrite(buffer, 0, buffer.Length, null, null);
        res.AsyncWaitHandle.WaitOne();
    }
 });
var t2 = Task.Factory.StartNew(() =>
{
     for (var i = buffer.Length - 1; i > 0; --i)
         buffer[i] = 0;
});
Task.WaitAll(t1, t2);