等待异步方法完成

3

我正在创建一个Windows Phone应用程序,在启动应用程序时,我会在应用程序的安装位置创建一个XML文件,然后调用一个方法,该方法使用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被初始化,然后再去读取用户设置?

1个回答

6

你需要将 CreateOrInitializeMainXml 的返回类型设置为 Task,并在事件处理程序中使用 asyncawaitTask

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

private async Task CreateOrInitializeMainXml() { ... }

以下是消费代码:

var isCreateFileSuccessfull = await CreateOrInitializeMainXml();

通常情况下,async void 只应用于事件处理程序async void 是"fire-and-forget"(即“发射并忘记”)的:您无法等待它,而在async void 方法中抛出的异常可能是不可捕获的,并可能导致应用程序崩溃。 async 关键字被描述为"病毒式" -- 当您开始使用它时,它会通过您的应用程序传播,因为越来越多的事情变得async 以便等待其他async 方法。这是完全自然和正常的。不要反对它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接