2013-10-23 53 views
1

我是新来的异步和等待编程风格。我如何解决以下问题:异步等待执行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<Categories>(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<Categories>> GetDefaultCategories() 
    {  
     HttpResponseMessage getresponse = await client.GetAsync(ServerBaseUri + "Categoryss");      
     string json = await getresponse.Content.ReadAsStringAsync();   
     json = json.Replace("<br>", Environment.NewLine); 
     var categories = JsonConvert.DeserializeObject<List<Categories>>(json); 
     return categories.ToList(); 
    } 
} 

回答

7

你应该避免async void。我在MSDN article中解释了这个指导原则。

一旦你改变你的async void方法async Task

public async Task GetCategoriesAsync() 
{    
    Categorieslist = new ObservableCollection<Categories>(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事件之外 - 这会让你的代码更容易测试。看看我的async constructors博客文章的想法。