2014-07-06 85 views
2

我正在用XNA和Monogame編寫Windows 8 Metro應用程序。 我使用這個代碼文件閱讀:如果讀取文件,Windows 8 Metro App只能在調試器中啓動

文件閱讀:

private void getDoc(String filename) 
    { 
     readstate = 0; 

     try 
     { 
      // get the file 
      //StorageFile myStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(filename); 
      String path = @"birdy2 - win8\XML\XMLFiles\" + filename + ".xml"; 
      StorageFile myStorageFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(path); 


      var readThis = await FileIO.ReadLinesAsync(myStorageFile); 
      String txt = ""; 
      foreach (var line in readThis) 
      { 
       txt += line.ToString(); 
      } 
      if (txt.Length > 0) 
      { 
       doc = XDocument.Parse(txt); 
      } 
      readstate = 1; 

     } 
     catch (FileNotFoundException ex) 
     { 
      doc = null; 
      readstate = 2; 
     } 

    } 

而且我調用該方法:

 XDocument gameinfo = null; 
     try 
     { 
      getDoc("gameinfo.xml"); 
      while (readstate == 0) { } 
      gameinfo = doc; 
     } 
     catch { gameinfo = null; } 

問題: 如果我調試該應用程序,一切工作正常。 如果我發佈的應用程序,然後我直接從Win8開始屏幕啓動它,該應用程序無法啓動。 我發現

while (readstate == 0) { } 

READSTATE從來沒有在釋放狀態得到任何不同比0。但不知道爲什麼。

我很滿意每一個答案。 謝謝!



謝謝你的回答快Nahel! 我重寫了代碼,但它仍然不起作用,和以前一樣。

private async Task<int> getDoc(String filename) 
    { 
     try 
     { 
      // get the file 
      StorageFile myStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);       
      var readThis = await FileIO.ReadLinesAsync(myStorageFile); 

      String txt = ""; 
      foreach (var line in readThis) 
      { 
       txt += line.ToString(); 
      } 
      if (txt.Length > 0) 
      { 
       doc = XDocument.Parse(txt); 
      } 
      return 1; 

     } 
     catch (FileNotFoundException ex) 
     { 
      doc = null; 
      return 2; 
     } 

    } 

以及加載:

 XDocument gameinfo = null; 
     try 
     { 
      Task<int> tsk = getDoc("gameinfo.xml");    
      int result = tsk.Result; 
      if (result == 1) 
      { 
       gameinfo = doc; 
      } 
      else 
      { 
       gameinfo = null; 
      } 

     } 
     catch { gameinfo = null; } 
+0

更新根據您的新代碼段我的答案。 –

回答

1

您正在使用有一些async操作,而沒有將其標記爲async的方法。

getDoc方法標記爲async並等待它在您稱之爲的地方。

而不是使用readstate變量,從getDoc方法返回int並在您的主要調用中使用該對象。或者甚至更好,返回你想要使用的文檔。

下面是如何一個異步/ AWAIT通話功能的圖片:

enter image description here

如果你有你的方法內的AWAIT,一旦代碼獲取它;它會返回給它的調用者。之後有一個無限循環不能幫助你。

Source

更新:

根據你的新的答案,你缺少的getDoc呼叫await

替換:

Task<int> tsk = getDoc("gameinfo.xml"); 

有:

Task<int> tsk = await getDoc("gameinfo.xml"); 
0

不可能使用:

Task<int> tsk = await getDoc("gameinfo.xml"); 

什麼工作對我來說,用的是第一個解決方案我提出的,並更改:

while (readstate == 0) { } 

while (readstate == 0) { 
     System.Threading.Tasks.Task.Yield();   
    } 
相關問題