2014-12-27 6 views
2

Я создаю приложение для Windows-телефона, где при запуске приложения я создаю xml в месте установки приложения, а затем вызываю метод, который инициализирует класс пользовательских настроек со значениями в xml. В начале я проверяю, доступен ли xml, если это не так, я создаю xml, если он присутствует, он считывается и пользовательские настройки инициализируются. Вот код в OnLaunched случае App.xaml.csДождитесь завершения метода Async

var isCreateFileSuccessfull = CreateOrInitializeMainXml(); 

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC); 

где HASHNOTESDOC имеет тип XDocument.

Тело метода заключается в том, как:

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 имеет значение null. Как я могу подождать, пока HASHNOTESDOC будет инициализирован, и только затем перейдите и прочитайте настройки пользователя?

ответ

6

Вы должны сделать тип возврата CreateOrInitializeMainXml в Task и await в Task в обработчик событий, который также должен быть async:

Таким образом, измените метод декларации:

private async Task CreateOrInitializeMainXml() { ... } 

а также код потребителя:

var isCreateFileSuccessfull = await CreateOrInitializeMainXml(); 

Общее правило для async void - это то, что вы должны использовать его только для обработчиков событий . async void «fire-and-forget»: вы не можете его ждать, а исключения, вызванные методами async void, могут быть несовместимыми и разбивать ваше приложение.

async ключевое слово было описано как «вирусный» - когда вы начнете использовать его, он будет распространяться через приложения, как все больше и больше вещей становятся async для того, чтобы await других async методов. Это совершенно естественно и прекрасно. Не бойся.

Смежные вопросы