2013-10-23 142 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博客文章的想法。