C# 调用BeginWrite时对缓冲区的更改
我很好奇,在BeginWrite实际完成写入之前对byte[]进行更改是否会影响FileStream最终写入的内容 下面是我的代码,currentPage是一个字节[],包含我想写的数据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
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读取。