【问题标题】:Xamarin Forms execution returns from await Httpclient PostAsyncXamarin Forms 执行从 await Httpclient PostAsync 返回
【发布时间】:2019-02-04 13:25:09
【问题描述】:

我正在调用一个方法getaddress();inside viewmodel 来从 API 获取地址信息。但是在调试时,执行返回 var response = await client.PostAsync(base_url + "api_delivery_details", formcontent).ConfigureAwait(false);调用方法getaddress(),但稍后执行剩余部分。所以得到空结果。如何从第一次全部执行?

public async void Get_branch_products()
    {
        RestClient restClient = new RestClient();            
        getaddresses();  //this is the calling method

        long delivery_fee1 = long.Parse(delivery_fee);
        GrandTotal = Total + (Total * Tax) / 100 + delivery_fee1 ;            
        OnPropertyChanged("GrandTotal");
        tax_amt = (Total * Tax) / 100;
        OnPropertyChanged("tax_amt");
    }

public async void getaddresses()
    {
        ind_vis = true;
        OnPropertyChanged("ind_vis");             
        int user_id = (int)App.Current.Properties["user_id"];
        RestClient restClient = new RestClient();
        var result = await restClient.Get_address(user_id);  //calling restAPI method

        if (result.status == "success")
        {
            ind_vis = false;
            OnPropertyChanged("ind_vis");

public async Task<Address> Get_address(int user_id)
    {
        var formcontent = new FormUrlEncodedContent(new[]
        {
           new KeyValuePair<string,string>("user_id",user_id.ToString())
        });
  //returns from here// var response = await client.PostAsync(base_url + "api_delivery_details", formcontent).ConfigureAwait(false); 
  //executes later// var result = await response.Content.ReadAsStringAsync();
        var Items = JsonConvert.DeserializeObject<Address>(result);
        return Items;
    }

【问题讨论】:

  • getaddresses() 应该返回 Task 并在 Get_branch_products 中等待。或使用 getaddresses(user_id).Result 并从方法中删除异步字

标签: xamarin xamarin.forms


【解决方案1】:

在使用async-awaitasync voids 创建后台线程时要记住一件事,除非永远不会使用内置事件处理程序。

因为异步 void 是一种即火即忘的类型,会引起很多难题。

您应该改用TaskTask&lt;T&gt;

我建议您阅读 MSDN 在Async and Await Best Practices 上的这篇很棒的指南,如果您阅读它,他们已经很好地解释了所有内容。

现在跳转到您的代码,您需要在代码中进行以下更改,以免发生此问题

执行在var response = await client.PostAsync(base_url + "api_delivery_details", formcontent).ConfigureAwait(false); 处返回到调用方法getaddress(),但稍后执行剩余部分。所以得到空结果。如何从第一次全部执行?

如下更改您的代码:

 public async Task Get_branch_products()
    {
        RestClient restClient = new RestClient();            
        await GetAddresses();  //this is the calling method

        long delivery_fee1 = long.Parse(delivery_fee);
        GrandTotal = Total + (Total * Tax) / 100 + delivery_fee1 ;            
        OnPropertyChanged("GrandTotal");
        tax_amt = (Total * Tax) / 100;
        OnPropertyChanged("tax_amt");
    }

public async Task GetAddresses()
    {
        ind_vis = true;
        OnPropertyChanged("ind_vis");             
        int user_id = (int)App.Current.Properties["user_id"];
        RestClient restClient = new RestClient();
        var result = await restClient.Get_address(user_id);  //calling restAPI method

        if (result.status == "success")
        {
            ind_vis = false;
            OnPropertyChanged("ind_vis");

public async Task<Address> Get_address(int user_id)
    {
        var formcontent = new FormUrlEncodedContent(new[]
        {
           new KeyValuePair<string,string>("user_id",user_id.ToString())
        });
  //returns from here// var response = await client.PostAsync(base_url + "api_delivery_details", formcontent).ConfigureAwait(false); 
  //executes later// var result = await response.Content.ReadAsStringAsync();
        var Items = JsonConvert.DeserializeObject<Address>(result);
        return Items;
    }

完成此操作后,您的代码将等待GetAddresses 方法为您获取数据,然后它将进一步移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多