簡體   English   中英

如何從異步方法獲取復雜類型

[英]How to get a complex type from async method

 public ObservableCollection<Offer> ModelPersons
    {
        get
        {

            return _persons;
        }


        set
        {
            _persons = value;

            RaisePropertyChanged(() => ModelPersons);
        }
    }

//如何從Task<ObservableCollection<Person>>獲取ObservableCollection<Person> 現在它抱怨無法將源類型Task<Observable<Person>> to Observable<Person>

  private void GetPersonOrders()
    {
        ModelPersons = _service.GetPersonOrders();
    }

在服務類:

  private ObservableCollection<Person> _modelPersons;


    public async Task<ObservableCollection<Person>> GetPersonOrders()
    {

        var req =
           WebRequest.Create(
              "http....")
               as HttpWebRequest;

        if (req == null) return null;
        req.KeepAlive = false;
        req.Method = "GET";
        req.ContentType = "text/xml; encoding='utf-8'";

        WebResponse response = req.GetResponse();
        Stream receiveStream = response.GetResponseStream();

        Encoding encode = Encoding.GetEncoding("utf-8");
        string message = null;
        if (receiveStream != null)
            using (var readStream = new StreamReader(receiveStream, encode))
            {
                var result = new char[256];
                int count = await readStream.ReadAsync(result, 0, 256);
                while (count > 0)
                {
                    var value = new String(result, 0, count);
                    message += value;
                    count = await readStream.ReadAsync(result, 0, 256);
                }


                var stringReader = new StringReader(message);
                _modelPersons= new ObservableCollection<Person>();
                var xmlTextReader = new XmlTextReader(stringReader);
                xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
                Person person = null;
                string element = "";
                while (xmlTextReader.Read())
                {
                    if (xmlTextReader.NodeType == XmlNodeType.Element)
                    {
                        element = xmlTextReader.Name;
                    }

                    else if (xmlTextReader.NodeType == XmlNodeType.Text)
                    {
                        switch (element)
                        {
                            case "name":
                                person = new Person { Name = xmlTextReader.Value };
                                _modelPersons.Add(person);
                                break;



                        }
                    }
                }
            }
        return _modelPersons;
    }

我建議你使用我的AsyncEx庫中NotifyTaskCompletion類型

然后你的代碼將如下所示:

private INotifyCompletion<ObservableCollection<Offer>> _persons;
public INotifyCompletion<ObservableCollection<Offer>> ModelPersons
{
  get { return _persons; }
  set
  {
    _persons = value;
    RaisePropertyChanged(() => ModelPersons);
  }
}

private void GetPersonOrders()
{
  ModelPersons = NotifyCompletion.Create(_service.GetPersonOrdersAsync());
}

您的數據綁定將從ModelPersons更改為ModelPersons.Result

進一步推薦閱讀:

由於您的方法返回Task<ObservableCollection<Person>>您可以通過Result屬性獲取任務的Result

private void GetPersonOrders()
{
    ModelPersons = _service.GetPersonOrders().Result;
}

但請記住,訪問Result屬性將阻止調用線程,直到任務完成,即直到您將收到WebResponse

另一種方法是使用ContinueWith將延續任務附加到方法返回的任務。 continuation將屬性設置為從task返回的值。

private void GetPersonOrders()
{
    _service.GetPersonOrders()
        .ContinueWith(t => ModelPersons = t.Result);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM