当我正在学习system.io FileStream
中的类FileStream时我看到了一个标题为“河流位置变化的检测”的段落(重点是我的):
当FileStream对象的句柄没有排他性保留时,另一个线程可以同时访问文件句柄并更改与文件句柄关联的操作系统的文件指针的位置。在这种情况下,FileStream对象中的缓存位置和缓冲区中的缓存数据可能会受到影响。 FileStream对象通常对访问缓存缓冲区的方法执行检查,以确保操作系统的句柄位置与FileStream对象使用的缓存位置相同。
如果在对Read方法的调用中检测到句柄位置的意外更改,则.NET Framework将丢弃缓冲区的内容,并再次从文件中读取流。这可能会影响性能,具体取决于文件的大小以及可能影响文件流位置的其他任何过程。
如果在调用Write方法中检测到句柄位置发生意外变化,则缓冲区的内容将被丢弃,并抛出IOException异常。
我试图编写此代码
private void button1_Click(object sender,EventArgs e)
{
Task t1 =Task.Run(() => change());
Task<string> t = Task.Run(() => mama());
Thread.Sleep(1);
textBox1.Text = t.Result;
}
void change()
{
FileStream fs = new FileStream("test.txt",FileMode.OpenOrCreate,Fileaccess.ReadWrite,FileShare.ReadWrite,4096,true);
while(true)
{
fs.Seek(0,SeekOrigin.Begin);
}
}
string mama()
{
FileStream fs2 = new FileStream("test.txt",1,true);
byte[] data = new byte[fs2.Length];
fs2.Read(data,data.Length);
return Encoding.Default.GetString(data);
}
我希望文本不会在文本框中追加,因为fs2.read()每次都会丢弃缓冲区
因为fs.seek(0,seekorigin.begin),但是文本附加在文本框中,为什么?
任何人都可以告诉我为什么我将buffer设置为1且文本不小的时候在文本框中添加文本