我正在创建一个Windows手机应用程序,在应用程序启动时,我在应用程序的安装位置创建一个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初始化后再去读取用户设置?
答案 0 :(得分:6)
您必须在事件处理程序中将CreateOrInitializeMainXml
一个Task
和await
的返回类型设为Task
,这也必须是async
:< / p>
所以,改变你的方法声明:
private async Task CreateOrInitializeMainXml() { ... }
消耗代码:
var isCreateFileSuccessfull = await CreateOrInitializeMainXml();
async void
的一般规则是您只应将其用于事件处理程序。 async void
是&#34;即发即弃&#34;:您无法等待它,async void
方法中抛出的异常可能无法捕获并导致您的应用程序崩溃。
async
关键字被描述为&#34;病毒&#34; - 当您开始使用它时,它会在您的应用程序中传播,因为越来越多的事情变为async
,以便await
其他async
方法。这是完全自然和精细的。不要打它。