2015-10-29 3 views
0

Я делаю программу, которая позволяет вам катить пять различных типов многосторонних «кубиков», а когда вы катите число, я хочу, чтобы оно хранило его в текстовом файле. В верхней части моей формы есть элемент меню, который вы нажимаете, он закрывает StreamWriter и FileStream и открывает вторую форму, показывающую, какие числа были прокатаны и по какому типу они были свернуты (я имею в виду только числа, свернутые теперь для простоты), и он отлично выглядит. Но когда я закрываю Reader, Stream и вторую форму и возвращаюсь к первой форме, я пытаюсь повторно открыть Writer и Stream, и он говорит мне, что он уже используется.Попытка REOPEN Sytem.IO объектов

Моя первая форма в код:

using System; 
using System.Windows.Forms; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private Random ran = new Random(); 
     static FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write); 
     StreamWriter writer = new StreamWriter(outFile); 

     private int ranNum; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      ranNum = ran.Next(1, 21); 
      Display(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      ranNum = ran.Next(1, 13); 
      Display(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      ranNum = ran.Next(1, 5); 
      Display(); 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      ranNum = ran.Next(1, 9); 
      Display(); 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      ranNum = ran.Next(1, 11); 
      Display(); 
     } 
     private void Display() 
     { 
      lblNum.Text = String.Format("{0}", ranNum); 
      lblNum.Visible = true; 
      writer.WriteLine(ranNum); 
     } 

     private void historyToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      tabControl1.SelectedIndex = 1; 
      writer.Close(); 
      outFile.Close(); 
      History history = new History(); 
      history.ShowDialog(); 
     } 

     private void button1_Click_1(object sender, EventArgs e) 
     { 
      FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write); 
      StreamWriter writer = new StreamWriter(outFile); 
      tabControl1.SelectedIndex = 0; 
     } 
    } 
} 

Моя вторая форма в код:

using System; 
using System.Drawing; 
using System.IO; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class History : Form 
    { 
     public History() 
     { 
      InitializeComponent(); 
     } 

     static private FileStream inFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.Open, FileAccess.Read); 
     private StreamReader reader = new StreamReader(inFile); 

     private void History_Load(object sender, EventArgs e) 
     { 
      string item; 

      item = reader.ReadLine(); 
      try 
      { 
       lstHistory.Items.Add(item); 
      } 
      catch (Exception) 
      { 
       lstHistory.Font = new Font(lstHistory.Font.Name, 12, lstHistory.Font.Unit); 
       lstHistory.Items.Add("You have not rolled any numbers"); 
      } 
     } 
    } 
} 

ответ

1

Вы должны освободить неуправляемые ресурсы (в вашем случае файл) должным образом когда-то сделали с ним. Вызов функции Dispose() на stream однажды сделал с ним:

if(inFile != null){ 
    inFile.Dispose(); 
} 

А еще лучше, завернуть его в using(), как это:

using(FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write)){ 
    StreamWriter writer = new StreamWriter(outFile); 
    tabControl1.SelectedIndex = 0; 
} 

using будет автоматически вызывать Dispose() для вас в нужное время в (т. е. он проверяет, действительно ли объект null перед вызовом Dispose() на нем, чтобы избежать «null-исключения»). Проверьте this link for more details about the using statement.

Однако, если у вас одинаковый код во многих местах, вероятно, стоит обернуть его в шаблон singleton. Проверьте this Microsoft article on how to write a singleton pattern in C#.

+0

Есть ли инструкция по использованию, которую мне нужно использовать, потому что я не могу найти ключевое слово singleton? Также два других решения не помогли мне. –

+0

Каковы два других решения, которые не сработали для вас? Синглтон - это шаблон, а не синтаксис языка. Это похоже на то, что все функции открытия, чтения и записи файла в одном классе и вызова его функций в любом месте вы хотите в коде. Проверьте ссылку, которую я предоставил, чтобы узнать, как реализовать и использовать шаблон. Что касается 'use', да, это утверждение в C#, и вы можете прочитать больше об этом [здесь] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx). –

Смежные вопросы