繁体   English   中英

等待异步方法完成

[英]Wait for Async method to complete

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

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为空。 我怎样才能等到HASHNOTESDOC初始化后才去读取用户设置?

您必须将CreateOrInitializeMainXml的返回类型设为Task并在事件处理程序中await Task ,该事件处理程序也必须是async

因此,更改您的方法声明:

private async Task CreateOrInitializeMainXml() { ... }

以及消耗代码:

var isCreateFileSuccessfull = await CreateOrInitializeMainXml();

async void的一般规则是,只应将其用于事件处理程序 async void是“一劳永逸”的:您无法等待它,并且async void方法中引发的异常可能无法捕获,并导致应用程序崩溃。

async关键字已被描述为“病毒”-当您开始使用它时,它将随着越来越多的事物变为async在您的应用程序中传播,以await其他async方法。 这是完全自然和良好的。 不要打架

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM