c#一个公共流阅读器

c#一个公共流阅读器,c#,streamreader,C#,Streamreader,我对C#不太了解。我正在尝试创建一个程序,可以计算跑步比赛的结果。我创建了两个方法:DoStuff(),用它设置Datagridview表列并显示一个拆分的文本文件。和方法-Sorter(),用它将跑步者分组并显示在列表框中 我的问题。 每次尝试调试程序时,都会出现以下错误: '无法从关闭的文本阅读器读取。' 如您所见,我将StreamReader设置为public。但这两种方法都无法访问它。 是否有可能以这样的方式使用一个StreamReader?! 或者我必须在表单加载中编写代码,然后这是访

我对C#不太了解。我正在尝试创建一个程序,可以计算跑步比赛的结果。我创建了两个方法:DoStuff(),用它设置Datagridview表列并显示一个拆分的文本文件。和方法-Sorter(),用它将跑步者分组并显示在列表框中

我的问题。 每次尝试调试程序时,都会出现以下错误:

'无法从关闭的文本阅读器读取。'

如您所见,我将StreamReader设置为public。但这两种方法都无法访问它。 是否有可能以这样的方式使用一个StreamReader?! 或者我必须在表单加载中编写代码,然后这是访问它的唯一方法? 我的代码

公共部分类表单1:表单
{
public StreamReader sr=new StreamReader(@“C:\Users\Oscar\Desktop\result.txt”);
公共弦线;
公共列表V=新列表();
公共列表V12=新列表();
公共列表V14=新列表();
公共列表V18=新列表();
公共列表V50=新列表();
public List VB=新列表();
公共列表VC=新列表();
公共列表S=新列表();
公共列表S12=新列表();
公共列表S14=新列表();
公共列表S18=新列表();
公共列表S40=新列表();
公共表格1()
{
初始化组件();
}
公共void ReadFile()
{
}
私有void Form1\u加载(对象发送方、事件参数e)
{
分拣机();
Dostuff();
}
公共空间
{
如果(!System.IO.File.Exists(@“C:\Users\Oscar\Desktop\result.txt”))
回来
dataGridView1.ColumnCount=3;
dataGridView1.Columns[0]。HeaderCell.Value=“Number”;
dataGridView1.Columns[1].HeaderCell.Value=“name”;
dataGridView1.Columns[2].HeaderCell.Value=“时间”;
使用(sr)
while(sr.Peek()>-1)
{
dataGridView1.Rows.Add(sr.ReadLine().Split(“;”);
}            
}
公共空隙分拣机()
{
使用(sr)
而((line=sr.ReadLine())!=null)
{
if(line.Contains(“;V;”){V.Add(line);}
else如果(line.Contains(“;V12;”){V12.Add(line);}
else如果(line.Contains(“;V14;”){V14.Add(line);}
else如果(line.Contains(“;V18;”){V18.Add(line);}
else如果(line.Contains(“;V50;”){V50.Add(line);}
else如果(line.Contains(“;S12;”){S12.Add(line);}
如果(行包含(“;S14;”){S14.添加(行);}
else如果(line.Contains(“;S18;”){S18.Add(line);}
else如果(line.Contains(“;S40;”){S40.Add(line);}
如果(line.Contains(“;S;”){S.Add(line);}
}
listBox1.DataSource=V12;
listBox2.DataSource=V50;
listBox3.DataSource=V;
listBox4.DataSource=S;
listBox5.DataSource=S18;
listBox6.DataSource=S40;
}
}

您的StreamReader位于SORTER()方法的using块中。这意味着在该块结束后,StreamReader将被释放。当您尝试在DoStuff()方法中重用同一个StreamReader时,您将得到所描述的错误,因为该StreamReader不再处于可从中读取的状态


您可以在每个方法中创建全局变量,而不是为StreamReader创建全局变量。

不要在表单定义中这样做:

public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
在创建表单时打开一次文件并保持打开状态。如果出现IO错误,这样做可能会阻塞或崩溃应用程序,并且通常会导致“文件正在使用”错误。您应该仅在实际需要使用文件时才打开该文件,然后立即关闭该文件。无论您在哪里:

using (sr)
您应该这样做:

using (var sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt"))
using (var sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "result.txt")))
实际上,您应该这样做:

using (var sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt"))
using (var sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "result.txt")))

第1课:正确格式化代码。如果缩进是正确的,并且在不添加逻辑语义的地方删除空行,则更容易发现错误。(@Amy现在帮你做了)第二课:每次你用写
,正在使用的对象都会被销毁。对
sr
执行两次,因此它将在第一次而不是第二次运行。
使用(sr)
。你在这里处理你的读卡器。你不必将sr设置为公共占位符,你可以在using语句中声明一个。第一个问题:为什么不在需要时打开流并在完成时关闭它?你需要将这些新的流读卡器分配给usingCorrect中的一个变量,@Scott。