繁体   English   中英

在 Unity 中重新加载场景后,StreamReader 无法正常工作

[英]StreamReader not working correctly after reloading scene in Unity

我有一个流阅读器,用于将数据解析为程序。 当我第一次从主菜单打开场景时,流阅读器在解析数据时工作正常(我在代码片段中省略了解析,因为代码很长)。 第一次运行时输出到屏幕的 text.text 是 G。如果我回到主菜单,然后回到这个场景,但是 text.text 输出是我的代码读取文本的文本文档的第一行.text = line 我想找出原因。 sr.Close() 不是关闭流阅读器的正确方法吗? 或者文件以某种方式仍然打开?

void Start () {
    text.text = "A";
    trimAndPlaceDataSets = GetComponent<TrimAndPlaceDataSets> ();
    text.text = "B";
    string AthenaData = Application.streamingAssetsPath + "/Athena.txt";
    text.text = "C";
    PopulateAthenaData(AthenaData);
}

void PopulateAthenaData(string s){
    text.text = "D";
    using (StreamReader sr = new StreamReader(s)) {
        text.text = "E";
        string line = sr.ReadLine();
        text.text = line;
        while (line != null) {
            //Do Stuf
            sr.ReadLine();
        }
        sr.Close();
        text.text = "G";
    }
}

这就是我加载场景的方式

public void LoadPressed() {
        scenesDropdown.gameObject.SetActive(false);
        loadButton.SetActive(false);
        SceneManager.LoadScene(scenesArray[scenesDropdown.value]);
    }

以正确的方式为您使用 do close stream,这是因为 StreamReader 类已经实现了接口 IDisposable,这让我们可以使用 using 语句,该语句在作用域结束后自动调用 SreamReader 中的 Dispose 方法,在该方法中清除资源并关闭打开的文件,如果需要,因为最后一步称为垃圾收集器

using (StreamReader sr = new StreamReader(s))
{
    //do stuff with stream reader
    //sr.Close();
}

你的问题是关于“垃圾收集”(访问这个网址:“ https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/ ”)简单的答案是 C# 可以释放(处置)很多东西在您使用它们之后,但诸如“文件”之类的东西不是其中之一。 您必须在使用后释放它们,如果不这样做,您的文件将被打开并且另一个进程无法访问它。 工作完成后,您需要处理“StreamReader”。 并且“使用”这样做(您不需要为此编写自定义处理器)。

  using (StreamReader sr = new StreamReader("Your file path")) 
     {
         //do your work
     }

之后,文件将自动释放。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM