我为学校制作了一个小游戏,并且一切都按预期工作,但是当“ ITAMons”(这就是我们所说的)升级到if语句被访问并且流编写器正在尝试写入由一个streamreader
,但是streamreader
已关闭,但仍然说我无法访问该文件,因为它仍在使用中。
StreamReaders是在文档本身中定义的,在这里它们被定义,然后在ITAMon构造函数中使用
sr = new StreamReader(Zielordner.Text + "\\" + ITAListe.CheckedItems[0].ToString());
sr2 = new StreamReader(Zielordner.Text + "\\" + ITAListe2.CheckedItems[0].ToString());
ITAMon1 = new ITAMon(sr);
ITAMon2 = new ITAMon(sr2);
其结尾为sr.Close()
。
这里是整个构造函数:
public ITAMon(StreamReader sr)
{
ITAName = sr.ReadLine();
if (ITAName == String.Empty)
{
bool falsch = false;
Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
}
string[] Auslesung = sr.ReadLine().Split(';');
if (Auslesung.Length > 6)
{
switch (Auslesung[0])
{
case "Feuer":
Element = Element.Feuer;
break;
case "Wasser":
Element = Element.Wasser;
break;
case "Pflanze":
Element = Element.Pflanze;
break;
default:
Element = Element.Normal;
break;
}
Level = Convert.ToInt32(Auslesung[1]);
Leben = Convert.ToDouble(Auslesung[2]);
CurrentLife = Leben;
EXP = Convert.ToInt32(Auslesung[3]);
Look = Auslesung[4];
BaseDmg = Convert.ToInt32(Auslesung[5]);
Verteidigung = Convert.ToDouble(Auslesung[6]);
Geschwindigkeit = Convert.ToDouble(Auslesung[7]);
Erweitert = true;
}
else if (Auslesung.Length < 7)
{
switch (Auslesung[0])
{
case "Feuer":
Element = Element.Feuer;
break;
case "Wasser":
Element = Element.Wasser;
break;
case "Pflanze":
Element = Element.Pflanze;
break;
default:
Element = Element.Normal;
break;
}
Level = Convert.ToInt32(Auslesung[1]);
Leben = Convert.ToDouble(Auslesung[2]);
CurrentLife = Leben;
EXP = Convert.ToInt32(Auslesung[3]);
Look = Auslesung[4];
Erweitert = false;
}
string[] Attacke1 = sr.ReadLine().Split(';');
if (Attacke1.Length != 4)
{
bool falsch = false;
Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
}
Attacken[0] = new Attacke(Attacke1[0], Convert.ToInt32(Attacke1[1]), Convert.ToInt32(Attacke1[3]), Convert.ToInt32(Attacke1[2]));
string[] Attacke2 = sr.ReadLine().Split(';');
if (Attacke2.Length != 4)
{
bool falsch = false;
Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
}
Attacken[1] = new Attacke(Attacke2[0], Convert.ToInt32(Attacke2[1]), Convert.ToInt32(Attacke2[3]), Convert.ToInt32(Attacke2[2]));
string[] Attacke3 = sr.ReadLine().Split(';');
if (Attacke3.Length != 4)
{
bool falsch = false;
Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
}
Attacken[2] = new Attacke(Attacke3[0], Convert.ToInt32(Attacke3[1]), Convert.ToInt32(Attacke3[3]), Convert.ToInt32(Attacke3[2]));
string[] Attacke4 = sr.ReadLine().Split(';');
if (Attacke4.Length != 4)
{
bool falsch = false;
Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
}
Attacken[3] = new Attacke(Attacke4[0], Convert.ToInt32(Attacke4[1]), Convert.ToInt32(Attacke4[3]), Convert.ToInt32(Attacke4[2]));
sr.Close();
}
尽管sr.Close()
仍然说出了访问此if语句并且streamwriter
试图使用该路径时正在使用的路径。
if (ITAMon1.CrtLife <= 0 || ITAMon1.GetAttacken[0].Mgz == 0 & ITAMon1.GetAttacken[1].Mgz == 0 & ITAMon1.GetAttacken[2].Mgz == 0 & ITAMon1.GetAttacken[3].Mgz == 0)
{
// This Line srG is a streamwriter despite the name
srG = new StreamWriter(Zielordner.Text + "\\" + ITAListe2.CheckedItems[0].ToString());
EventLog.Text = ITAMon2.GetName + " Gewinnt!";
ITAMon2.GetEXP += ITAMon2.GetGegner.GetLevel;
if(ITAMon2.LvlUp())
{
Gewinner = ITAMon2;
MessageBox.Show(ITAMon2.GetName + " hat das nächste Level erreicht!", "LevelUp", MessageBoxButtons.OK, MessageBoxIcon.Information);
LevelUp levelUp = new LevelUp();
levelUp.Show();
}
else
{
ITAMon2.Save(srG);
this.Close();
MessageBox.Show(ITAMon2.GetName + " Gewinnt!", "Gewinner", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else if (ITAMon2.CrtLife <= 0 || ITAMon2.GetAttacken[0].Mgz == 0 & ITAMon2.GetAttacken[1].Mgz == 0 & ITAMon2.GetAttacken[2].Mgz == 0 & ITAMon2.GetAttacken[3].Mgz == 0)
{
// This Line srG is a streamwriter despite the name
srG = new StreamWriter(Zielordner.Text + "\\" + ITAListe.CheckedItems[0].ToString());
EventLog.Text = ITAMon1.GetName + " Gewinnt!";
ITAMon1.GetEXP += ITAMon1.GetGegner.GetLevel;
if (ITAMon1.LvlUp())
{
Gewinner = ITAMon1;
MessageBox.Show(ITAMon1.GetName + " hat das nächste Level erreicht!", "LevelUp", MessageBoxButtons.OK, MessageBoxIcon.Information);
LevelUp levelUp = new LevelUp();
levelUp.Show();
}
else
{
ITAMon1.Save(srG);
this.Close();
MessageBox.Show(ITAMon1.GetName + " Gewinnt!", "Gewinner", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
有人有任何解决办法的想法吗?即使我手动将sr.Close()
手动写入文档本身,但仍然无法使用,它还是应该可用的,不胜感激。
经验法则,只要有实现IDisposable
的class,就始终使用using statement。您可以通过阅读文档找到答案。实际上,在这种情况下,StreamReader
Class
如果您这样处理,则可以大大减少此类问题。一个using语句自然会在退出作用域后Disposes
,并且流将在Dispose
]上调用close
,您只是关闭其中之一。再次说明,如果您使用了using statement,就不会有错误重要
此类型实现IDisposable接口。完成后使用该类型,您应该直接将其处理掉间接地。要直接处理该类型,请调用其Dispose方法在try / catch块中。要间接处理它,请使用一种语言构造,例如using(在C#中)或Using(在Visual Basic中)。欲了解更多信息,请参阅“使用实现IDisposable的对象”[IDisposable接口主题]部分。
关于您的问题,您有2个StreamReaders
在我看来,using语句绝对是最好的方法,但也请确保刷新和关闭。示例显示了XML Writer,但是原理是相同的。