Приложение зависает при использовании IO C# - PullRequest
0 голосов
/ 12 марта 2020

Я не знаю, что вызывает проблему, но всякий раз, когда я пытаюсь прочитать из текстового файла в этой ситуации, приложение зависает.

private void btnCount_Click(object sender, EventArgs e)
{
   int totalVotes = 0;
   int votesFirst = 0;
   int votesSecond = 0;

   string firstClub;
   string secondClub;

   FileStream fs = null;
   StreamReader sr = null;

   if (tb1.Text == "" || tb2.Text == "")
   {
       MessageBox.Show("Fill in the fields");
   }
   else
   {
       firstClub = tb1.Text;
       secondClub = tb2.Text;

       try
       {
           fs = new FileStream("C:\\Users\\dluuk\\source\\repos\\PopularFootballClubs\\Polls\\bin\\Debug\\FootballClubs.txt", FileMode.Open, FileAccess.Read);
           sr = new StreamReader(fs);
           string s = sr.ReadLine();

           while (s != null)
           {
               if (s.Contains(firstClub))
               {
                   votesFirst++;
                   totalVotes++;
               }
               else if (s.Contains(secondClub))
               {
                   votesSecond++;
                   totalVotes++;
               }
           }
       }
       catch (IOException ex)
       {
           MessageBox.Show(ex.Message);
       }
       catch (Exception)
       {
           MessageBox.Show("something wrong happened");
       }
       finally
       {
           lblTotal.Text = totalVotes.ToString();
           lbl1.Text = votesFirst.ToString();
           lbl2.Text = votesSecond.ToString();

           if (sr != null) { sr.Close(); }

           if (fs != null) { fs.Close(); }
       }
   }
}

Я закрываю соединение, и путь правильный потому что я не получаю никаких исключений в этом текущем состоянии, поэтому я действительно не вижу проблемы. Может быть, вы можете помочь?

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Вы вообще не обновляете s, поэтому ваш l oop бесконечен. Он читает первую строку, затем зацикливается снова и снова, используя одну и ту же строку каждый раз, потому что ReadLine() больше не вызывается в области действия l oop (и, таким образом, вы никогда не достигнете конца файла - или даже строка 2).

Вы можете изменить что-то вроде этого:

string s;

while ((s = sr.ReadLine()) != null)
{
    if (s.Contains(firstClub))
    {
        votesFirst++;
        totalVotes++;
    }
    else if (s.Contains(secondClub))
    {
        votesSecond++;
        totalVotes++;
    }
}  

В качестве примечания, вы должны поместить using операторов вокруг ваших Stream с. Они одноразовые, и вам не нужно обращаться с ними вручную.

1 голос
/ 12 марта 2020

while (s != null)

Вы никогда не измените s в l oop, поэтому оно застревает в бесконечном l oop. Обновление s в конце l oop:

while (s != null)
{
  // do stuff
  s = sr.ReadLine();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...