2017-11-10 6 views
1

私はストリーム・リーダーを持っています。データをプログラムに解析するために使用しています。メインメニューから最初にシーンを開くと、ストリームリーダーがデータを解析するときに正しく動作します(コードが長いので、スニペットで解析を省略しました)。最初の実行時に画面に出力されるtext.textはGです。メインメニューに戻ってこのシーンに戻っても、text.text出力はテキスト文書の最初の行です.text = lineと私は理由を理解しようとしています。 sr.Close()はストリームリーダーを閉じる適切な方法ではありませんか?または、ファイルが何らかの形でまだ開いていますか?誰もが提供できるあらゆる助けを進んでいただきありがとうございます。Unityのシーンをリロードした後にStreamReaderが正しく動作しない

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"; 
    } 
} 

そして、私は私のシーンStreamReaderクラスがインタフェースIDisposableを実装しているので、これは適切な方法であなたのために近いストリームを行う使用

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

「IDisposable」を実装する「StreamReader」などのクラスで「using」ステートメントを使用することを検討してください。 'StreamReader'がスコープから脱落すると、それは自動的にクローズされて処分され、特に例外処理を考慮して、ロジックを単純化します。 – STLDeveloper

+0

これらのシーンにどのくらい正確に戻っていますか?ゲームの実行中にLoadScene()を使用していますか? –

+0

メインメニューからSceneManager.LoadScene(文字列)を使用しています。編集にコードを追加しました。 –

答えて

2

あなたの問題は「ガベージコレクション」(このURLにアクセスしてください:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/) 簡単な答えは、C#は使用後にたくさんのものをリリース(処分)できますが、「ファイル」のようなものはその1つではありません。あなたはそれらを解放しなければならないし、そうでなければあなたのファイルは開かれ、別のプロセスはそれにアクセスすることができません。作業が完了したら、 "StreamReader"を処分する必要があります。そして "使用する"ことは(それのためのカスタムディスポーザーを書く必要はありません)。

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

その後、ファイルは自動的に解放されます。

3

をロードしていますどのようにこれは、この文を使用して使用することができますスコープ終了後、SreamReaderで自動的にDisposeメソッドが呼び出され、そのメソッドでリソースがクリアされ、開いているファイルが閉じられ、最後に必要な場合はガベージコレクタと呼ばれます。

+0

は無限ループのように見えます。スニペットでは、決してnullにラインを割り当てないので、欠落しています:line = sr.ReadLine(); – Sonikas

+0

この回答と上記の違いは何ですか?これが解決されても、15分後に新しい回答を追加する必要がありました。何も改善されていません... – PassetCronUs

+0

私は前に回答していましたが、OPは私の解決策を使用しましたが、受け入れられた答えはより詳細です – Sonikas

関連する問題