调用BeginWrite时对缓冲区的更改

时间:2014-10-01 22:00:41

标签: c# asynchronous file-io

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

下面是我的代码,currentPage是一个包含我想写的数据的byte []。

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的新byte [])? FileStream是否缓冲了要在某处写入的byte [],或者它实际上只是引用了我调用它时传入的byte []?

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

  

多个同步异步请求使请求完成顺序不确定。

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

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

执行此代码的确切结果将取决于计算机,当前CPU使用率等。在我的计算机上,有一次我发现大约77%的创建文件包含255s而其余的为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);