c# - c# 中的 FileStream - 检测流位置变化?
问题描述
当我正在学习 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", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1, true);
byte[] data = new byte[fs2.Length];
fs2.Read(data,0, data.Length);
return Encoding.Default.GetString(data);
}
我希望文本框中不会附加任何文本,因为 fs2.read() 每次都会丢弃缓冲区
因为 fs.seek(0,seekorigin.begin) ,但是文本附加在文本框中,为什么?
谁能告诉我为什么文本会附加在文本框中,尽管我设置了 buffer = 1 并且文本不小
解决方案
推荐阅读
- flutter - 如何使用 StreamBuilder 在 pdf 中打印来自 Firebase Storage 的图像
- node.js - nodejs twitter如何结束流并开始一个新的
- python - 从输出中获取空白字符串
- java - 如何在 Heroku 中将 JDK 1.8 更改为 JDK 11?
- reactjs - 源更新后 Mapbox 图层未更新
- swift - 带有 Swift 的 sqlite3:特定路径不起作用
- r - 如何使用长度函数计算R中的行和列
- python - 数据库的 BigQuery
- javascript - 限制上传图片数量
- mongodb - MongoDB 在 Azure 中无法连接一次 - asp core 3.1 - Visual Studio 2019