C# 调用BeginWrite时对缓冲区的更改

C# 调用BeginWrite时对缓冲区的更改,c#,asynchronous,file-io,C#,Asynchronous,File Io,我很好奇,在BeginWrite实际完成写入之前对byte[]进行更改是否会影响FileStream最终写入的内容 下面是我的代码,currentPage是一个字节[],包含我想写的数据 try { FileStream.BeginWrite(currentPage, 0, currentPage.Length, new AsyncCallback(EndWriteCallback),new State(logFile.fs, currentPage, BUFFER_SIZE, manualEv

我很好奇,在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的文章,但我能找到的只是

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


有人能给我解释一下吗?

这段代码应该能回答你的问题。首先,我创建一个长字节数组,其中每个单元格都等于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);
var path=@“C:\Temp\Temp.txt”;
var list=新列表();
对于(变量i=0;i<1000000;++i)
增加(255);
var buffer=list.ToArray();
var t1=Task.Factory.StartNew(()=>
{
使用(var fs=File.OpenWrite(path))
{
var res=fs.BeginWrite(buffer,0,buffer.Length,null,null);
res.AsyncWaitHandle.WaitOne();
}
});
var t2=Task.Factory.StartNew(()=>
{
对于(var i=buffer.Length-1;i>0;--i)
缓冲区[i]=0;
});
Task.WaitAll(t1,t2);

对我来说,“不确定的完成顺序”意味着函数不是线程安全的,这可能意味着使用
字节[]
执行任何操作都可能导致意外后果。是的,设备驱动程序直接从currentPage读取。