等待异步方法完成

ng-*_*g-R 2 c# xaml windows-phone-8.1

我正在创建一个Windows手机应用程序,在应用程序启动时,我在应用程序的安装位置创建一个xml,然后我调用一个方法,该方法使用xml中的值初始化用户设置类.在开始时,我检查xml是否已经可用,如果不是,我创建一个xml,如果它存在,则读取它并初始化用户设置.这是App.xaml.cs的OnLaunched事件中的代码

var isCreateFileSuccessfull = CreateOrInitializeMainXml();

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC);
Run Code Online (Sandbox Code Playgroud)

其中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
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,由于上述方法是异步方法,即使在完成之前,控制也会尝试执行该行

UserSettings.GetInstance().GetValuesFromXmlDoc(HASHNOTESDOC);
Run Code Online (Sandbox Code Playgroud)

此时HASHNOTESDOC为空.我怎么能等到HASHNOTESDOC初始化后再去读取用户设置?

Dan*_*ann 6

你必须做的返回类型CreateOrInitializeMainXmlTaskawaitTask事件处理程序,它也必须是async:

所以,改变你的方法声明:

private async Task CreateOrInitializeMainXml() { ... }
Run Code Online (Sandbox Code Playgroud)

消费代码:

var isCreateFileSuccessfull = await CreateOrInitializeMainXml();
Run Code Online (Sandbox Code Playgroud)

一般规则async void是您应该只将它用于事件处理程序.async void是"一劳永逸":你无法等待它,async void方法中抛出的异常可能无法捕获并导致应用程序崩溃.

async关键字被描述为"病毒式" - 当您开始使用它时,它将通过您的应用程序传播,因为越来越多的东西变成asyncawait其他async方法.这是完全自然和精细的.不要打它.