gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:46:27 25 4
gpt4 key购买 nike

我很好奇在 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 进行更改(比如分配一个新的 byte[],其中全为 0)会发生什么? FileStream 是否缓冲要写入某处的字节[],或者它实际上只是引用我调用它时传入的字节[]?

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

Multiple simultaneous asynchronous requests render the request completion order uncertain.

谁能给我解释一下吗?

最佳答案

这段代码应该可以回答您的问题。首先,我创建了一个长字节数组,其中每个单元格都等于 255。然后我启动了 2 个线程。第一个负责将准备好的字节数组写入文件。同时,第二个线程通过将每个单元格设置为 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);

关于c# - 调用 BeginWrite 时对缓冲区的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26151403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com