c# 一个 public Streamreader

c# One public Streamreader

我对 C# 了解不多。我正在尝试创建一个可以计算 运行 比赛结果的程序。我创建了两种方法:DoStuff(),我用它设置了一个 Datagridview table 列并显示了一个文本文件 splitted.And Method-Sorter(),我用它对跑步者进行分组并显示它们在列表框中。

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

'Cannot read from a closed TextReader.'

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

 public partial class Form1 : Form
{
    public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
    public string line;
    public  List<string> V = new List<string>();
    public  List<string> V12 = new List<string>();
    public  List<string> V14 = new List<string>();
    public  List<string> V18 = new List<string>();
    public  List<string> V50 = new List<string>();
    public  List<string> VB = new List<string>();
    public  List<string> VC = new List<string>();

    public  List<string> S = new List<string>();
    public  List<string> S12 = new List<string>();
    public  List<string> S14 = new List<string>();
    public  List<string> S18 = new List<string>();
    public  List<string> S40 = new List<string>();

    public Form1()
    {
        InitializeComponent();            
    }

    public void ReadFile()
    {
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        SORTER();
        Dostuff();         
    }


    public void Dostuff()
    {
        if (!System.IO.File.Exists(@"C:\Users\Oscar\Desktop\result.txt"))
            return;
        dataGridView1.ColumnCount = 3;
         dataGridView1.Columns[0].HeaderCell.Value = "Number";
          dataGridView1.Columns[1].HeaderCell.Value = "name";
           dataGridView1.Columns[2].HeaderCell.Value = "time";

        using (sr)
            while (sr.Peek() > -1 )
            {
                dataGridView1.Rows.Add(sr.ReadLine().Split(';'));                    
            }            
    }

    public void SORTER()
    {
        using (sr)
            while ((line = sr.ReadLine()) != null)
            {
                if (line.Contains(";V;")) { V.Add(line); }
                else if (line.Contains(";V12;")) { V12.Add(line); }
                else if (line.Contains(";V14;")) { V14.Add(line); }
                else if (line.Contains(";V18;")) { V18.Add(line); }
                else if (line.Contains(";V50;")) { V50.Add(line); }

                else if (line.Contains(";S12;")) { S12.Add(line); }
                else if (line.Contains(";S14;")) { S14.Add(line); }
                else if (line.Contains(";S18;")) { S18.Add(line); }
                else if (line.Contains(";S40;")) { S40.Add(line); }
                if (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")))