在Windows商店应用程序上等待,没有按预期工作

时间:2014-02-18 11:28:40

标签: c# windows-runtime windows-store async-await

在我正在工作的Windows商店项目上的

我在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任务是否应该阻止视图加载?

1 个答案:

答案 0 :(得分:2)

它没有等待,因为InsertDBasync 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