任务异步中的访问列表<object>

时间:2015-09-18 09:06:28

标签: c# async-await

我有这段代码来加载和计算来自API服务器的数据;

class TestNetWork
  {
    private Task taskFillPicker;
    private List<CityItemDB> itemsCity;
    private CustomPicker cpCity; 

    public async Task FillPicker()
      {
          try {
            JObject res = await SuperFUNC.GET_CITY_ACTIVE_SENDER();
            if(res == null){
              //null
            }else{
              string message = res["message"].ToString();
              if(message.Equals("Success")){

                itemsCity.Clear();
                cpCity.Items.Clear();

                JArray data = (JArray)res["data"];
                int count = data.Count;
                for (int i = 0; i < count; i++) {
                  CityItemDB node = new CityItemDB();
                  node.cityId = Int32.Parse(data[i]["cityId"].ToString());
                  node.cityName = data[i]["cityName"].ToString();

                  itemsCity.Add(node);
                  cpCity.Items.Add(node.ToString());
                }
              }else{
              //null
              }
            }
          } catch (Exception ex) {
            Debug.WriteLine (TAG + " : " + ex.StackTrace);  
          }
      }

    public TestNetWork()
      {
          this.itemsCity = new List<CityItemDB> ();

          this.cpCity = new CustomPicker {
            HeightRequest = 40,
            TextColor = Color.FromHex("#5a5a5a"),
            Title = "City Choose",
          };

          taskFillPicker = FillPicker ();

          Debug.WriteLine (COUNT + " : " + itemsCity.Count);  
      }
  }

但是控制台打印我COUNT : 0,我确定来自互联网的代码获取和解析json是正确的,选择器显示完整数据但List<CityItemDB> itemsCity计数为0.

感谢阅读,抱歉我的英语不好!

1 个答案:

答案 0 :(得分:1)

您需要等待任务,否则可能会在FillPicker完成之前继续执行:

taskFillPicker = await FillPicker ();

由于此代码位于无法进行等待的构造函数中,我建议将其移至单独的异步方法:

  public async Task Init()
  {          
      taskFillPicker = await FillPicker ();

      Debug.WriteLine (COUNT + " : " + itemsCity.Count);  
  }

您现在必须编写更多代码来构建对象:

 var n = new TestNetWork();
 await n.Init();