【问题标题】:async await execution windows phone 8异步等待执行 Windows Phone 8
【发布时间】:2013-10-23 11:37:16
【问题描述】:

我是 async 和 await 编程风格的新手。我该如何解决以下问题:

我先调用下面的代码。这里的问题是第一行正在等待它需要填充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();
    }
}

【问题讨论】:

    标签: c# windows-phone-8 async-await c#-5.0 dotnet-httpclient


    【解决方案1】:

    你应该避免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 事件之外进行所有 VM 初始化 - 这将使您的代码更易于测试。请查看我的 async constructors 博客文章以获取想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多