2014-12-27 232 views
2

我正在创建一个Windows Phone应用程序,在应用程序启动时,我在应用程序的安装位置创建一个xml,然后调用一个方法,该方法使用值初始化User settings类在xml中。 开始时,我检查xml是否已经可用,如果不存在,我创建一个xml,如果它存在,它将被读取并且用户设置被初始化。以下是在App.xaml.cs等待异步方法完成

var isCreateFileSuccessfull = CreateOrInitializeMainXml(); 

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC); 

其中HASHNOTESDOC是类型的XDocument的OnLaunched事件的代码。

的方法的主体是:

async private void CreateOrInitializeMainXml() 
    { 
     try 
     { 
      StorageFolder InstallationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; 
      string hashnotesFile = @"Assets\hashnotes.xml"; 

      StorageFile file = await InstallationFolder.GetFileAsync("hashnotes.xml"); 
      bool fileExists = await FileExists(InstallationFolder, "hashnotes.xml"); 

      if (!fileExists) 
      { 
       await file.CopyAsync(InstallationFolder); 
      } 

      StorageFile hashNoteXml = await InstallationFolder.GetFileAsync(hashnotesFile); 
      Stream hashNotesStream = await hashNoteXml.OpenStreamForWriteAsync(); 
      hashNotesXDocument = XDocument.Load(hashNotesStream); 

      hashNotesXDocument.Save(hashNotesStream); 

     } 
     catch 
     { 

     } 
    } 

问题是,由于上述方法是一种异步方法,它完成之前也,控制尝试执行线

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC); 

此时HASHNOTESDOC为空。我怎么才能等到HASHNOTESDOC被初始化,然后才去阅读用户设置?

回答

6

你必须做的CreateOrInitializeMainXml一个Taskawait在事件处理程序,这也必须是Task返回类型async

因此,改变你的方法声明:

private async Task CreateOrInitializeMainXml() { ... } 

而消费代码:

var isCreateFileSuccessfull = await CreateOrInitializeMainXml(); 

的一般规则是你应该只用它来处理事件处理程序async void是“即忘即忘”:您无法等待它,并且在async void方法中引发的异常可能无法解决并导致您的应用程序崩溃。

async关键字被描述为“病毒” - 当你开始使用它,它会通过你的应用程序,因为越来越多的东西传播成为async为了await其他async方法。这是非常自然和美好的。不要与它战斗。