[英]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
。
進一步推薦閱讀:
async
/ await
介紹及其后續資源,特別是TAP 。 async
屬性的博客文章。 由於您的方法返回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.