C# 异步等待执行windows phone 8

C# 异步等待执行windows phone 8,c#,windows-phone-8,async-await,c#-5.0,dotnet-httpclient,C#,Windows Phone 8,Async Await,C# 5.0,Dotnet Httpclient,我不熟悉异步和等待式编程。如何解决以下问题: 我先调用下面的代码。这里的问题是第一行正在等待,需要填充categoriesvm.Categorieslist,它没有,但是调用了第二行。(我认为这是Wait的默认行为) 如何确保只有在第一行中填充了categoriesvm.Categorieslist时才调用第二行 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) {

我不熟悉异步和等待式编程。如何解决以下问题:

我先调用下面的代码。这里的问题是第一行正在等待,需要填充
categoriesvm.Categorieslist
,它没有,但是调用了第二行。(我认为这是Wait的默认行为)

如何确保只有在第一行中填充了
categoriesvm.Categorieslist
时才调用第二行

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    categoriesvm.GetCategories();                 
    BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm;
}
在上面的代码中,当我执行第一行时,它位于下面,其中
Categorieslist
是我在上面访问的列表

public async void GetCategories()
{            
    Categorieslist = new ObservableCollection<Categories>(await PhoneClient.GetDefaultCategories());          
}

您应该避免
async void
。我用一种简单的方式解释了这一方针

一旦将
async void
方法更改为
async任务

public async Task GetCategoriesAsync()
{            
  Categorieslist = new ObservableCollection<Categories>(await PhoneClient.GetDefaultCategories());          
}

但是,我建议您在UI事件之外进行所有VM初始化—这将使您的代码更易于测试。请看我的博客文章以了解想法。

您应该避免
异步void
。我用一种简单的方式解释了这一方针

一旦将
async void
方法更改为
async任务

public async Task GetCategoriesAsync()
{            
  Categorieslist = new ObservableCollection<Categories>(await PhoneClient.GetDefaultCategories());          
}
但是,我建议您在UI事件之外进行所有VM初始化—这将使您的代码更易于测试。看看我的博客文章,了解一些想法

protected override async void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
  await categoriesvm.GetCategoriesAsync();                 
  BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm;
}