我在app.xaml.cs文件中有这段代码
...
DoStuff();
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(typeof(SomePage), e.Arguments);
}
在一些操作之后的DoStuff函数中,我调用另一个名为InsertDB的函数。
private async void InsertDB(RootObject obj)
{
await Task.Run(() => obj.InsereDB());
}
这个做的是将一些数据插入到sqlite数据库中。 现在我的问题是,当我启动我的应用程序时数据库开始填满,我可以看到因为我正在查看我的项目的LocalState文件夹中的文件,并且sqlite文件开始增长的大小,但在它完成获取之前我的视图(“SomePage”)中的数据被加载。
在“obj.InsereDB”函数返回之前,await任务是否应该阻止视图加载?
答案 0 :(得分:2)
它没有等待,因为InsertDB
是async void
方法,这意味着,从调用者的角度来看,它将同步运行直到它到达第一个await
关键词。一旦它这样做,它将返回给调用者。
想象一下:
private async void InsertDB(RootObject obj)
{
Console.WriteLine(1);
await Task.Run(() => obj.InsereDB());
Console.WriteLine(2);
}
InsertDB(obj);
Console.WriteLine(3);
此代码将打印1 3 2
。当InsertDB
点击await
关键字时,它会返回到调用者,后者打印3.该方法的其余部分以异步方式运行。
您需要让InsertDB
返回任务,并等待它。
private async Task InsertDB(RootObject obj)
{
Console.WriteLine(1);
await Task.Run(() => obj.InsereDB());
Console.WriteLine(2);
}
await InsertDB(obj);
Console.WriteLine(3);
这将打印1 2 3