2013-03-23 106 views
1

我想用StreamReader在Windows 8 C#文件中逐行讀取一個簡單的文本文件。我嘗試了很多解決方案,但沒有成功。有時文件被讀取,有時不是(類是空的,只有空值)。如果程序正在運行,它永遠不會工作,但是當我設置一個調試器並使用它逐行執行時,它有時會起作用。這是爲什麼?這就是源:用StreamReader逐行讀取文件

public async void read(string fileName) 
    { 

     string File = Path.Combine(Package.Current.InstalledLocation.Path, "myfolder", fileName); 

     StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(Path.GetDirectoryName(File)); 

     Stream s = await folder.OpenStreamForReadAsync(Path.GetFileName(File)); 
     StreamReader streamReader = new StreamReader(s); 

     myClass.name = streamReader.ReadLine(); 
     myClass.desc = streamReader.ReadLine(); 
     myClass.number = int.Parse(streamReader.ReadLine()); 
     myClass.house = new House[myClass.number]; 

     for (int i = 0; i < myClass.number; i++) 
     { 
      myClass.house[i] = new House(); 
      myClass.house[i].name = streamReader.ReadLine(); 
      myClass.house[i].size = double.Parse(streamReader.ReadLine()); 
     } 
    } 

回答

0

您應該只使用async void如果函數是一個事件處理程序(例如按下按鈕)。一般來說,您應該使用async Task

更改您的方法簽名從voidTask

public async Task read(string fileName) 

然後從你的調用代碼,await它:

await yourclass.read("c:\\my_filename.txt"); 
+0

我嘗試過,但我想調用方法時整頁面被初始化,但是當我在頁面構造器中寫入「await read(」filetoRead.txt「)」時,它表示'await'操作符只能在異步方法中使用,但是從我所知的構造函數不能異步。我是對的還是我錯過了什麼? – user2202439 2013-03-23 19:50:11

+0

@ user2202439 - 關於異步構造函數:看看這個http://stackoverflow.com/questions/14449349/winrt-async-data-load-in-constructor – 2013-03-23 22:45:29

+0

謝謝你的幫助。我多次閱讀斯蒂芬的博客,但我仍然無法正確寫出它。我有私人'異步任務 InitializeAsync()',在那裏我只用StreamReader讀取數據,並重試這個和'公共靜態異步任務 CreateAsync()'我在那裏調用InitializeAsync await。我使用'public static async Task'來調用這些方法。任務UseMyClassAsync() {instance} await MyClass.CreateAsync();並且它仍然有問題。我究竟做錯了什麼?你能舉個例子嗎? – user2202439 2013-03-24 11:32:08