async等待执行windows phone 8

我是异步的新手,等待编程风格。 如何解决以下问题:

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

如何在第一行填充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(await PhoneClient.GetDefaultCategories()); } 

phoneclient在下面

 public class PhoneClient { private static readonly HttpClient client; public static Uri ServerBaseUri { get { return new Uri("http://169.254.80.80:30134/api/"); } } static PhoneClient() { client =new HttpClient(); client.MaxResponseContentBufferSize = 256000; client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); } public async static Task<List> GetDefaultCategories() { HttpResponseMessage getresponse = await client.GetAsync(ServerBaseUri + "Categoryss"); string json = await getresponse.Content.ReadAsStringAsync(); json = json.Replace("
", Environment.NewLine); var categories = JsonConvert.DeserializeObject<List>(json); return categories.ToList(); } }

你应该避免async void 。 我在MSDN文章中解释了这个指南。

async void方法更改为async Task

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

然后你可以这样await它:

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

但是,我建议在UI事件之外进行所有VM初始化 – 这将使您的代码更容易测试。 看看我的async构造函数博客文章的想法。