2014-12-27 6 views
2

Windows Phone 앱을 만들 때 앱을 시작할 때 xml을 앱의 설치 위치에 만든 다음 값으로 사용자 설정 클래스를 초기화하는 메서드를 호출합니다. in xml. 처음에는 xml이 이미 사용 가능한지 확인하고 그렇지 않은 경우 xml을 만듭니다 (존재하는 경우 xml이 읽히고 사용자 설정이 초기화 됨). 여기 HASHNOTESDOC 유형의하여 XDocument이다 App.xaml.cs를비동기 메서드가 완료 될 때까지 대기

var isCreateFileSuccessfull = CreateOrInitializeMainXml(); 

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC); 

의 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은 null입니다. HASHNOTESDOC이 초기화 될 때까지 기다렸다가 사용자 설정 만 읽으면 어떻게됩니까?

답변

6

당신은 CreateOrInitializeMainXmlTaskawait도해야 이벤트 핸들러에서 Task의 반환 형식을해야 async :

private async Task CreateOrInitializeMainXml() { ... } 

그리고 :

그래서, 당신의 메서드 선언을 변경 소모 코드 :에 대한

var isCreateFileSuccessfull = await CreateOrInitializeMainXml(); 

일반적인 규칙은 이벤트 처리기에만 사용해야합니다. async void은 "화재와 잊기"입니다 : 당신은 그것을 기다릴 수없고 async void 메쏘드에서 던져진 예외는 uncatchable 일 수 있고 당신의 애플리케이션을 망칠 수 있습니다. async 키워드 "바이러스"로 기술되었다

- 당신이 그것을 사용하기 시작하면, 그것은 더 많은 것 같은 응용 프로그램을 통해 전파됩니다은 await 다른 async 방법에 위해 async된다. 이것은 완벽하고 자연 스럽습니다. 싸우지 마라.

관련 문제