C# 如何从异步方法获取复杂类型
服务级别:C# 如何从异步方法获取复杂类型,c#,asynchronous,C#,Asynchronous,服务级别: private void GetPersonOrders() { ModelPersons = _service.GetPersonOrders(); } private observeCollection\u model个人; 公共异步任务GetPersonOrders() { var请求= WebRequest.Create( “http…” 作为HttpWebRequest; 如果(req==null)返回null; req.KeepAli
private void GetPersonOrders()
{
ModelPersons = _service.GetPersonOrders();
}
private observeCollection\u model个人;
公共异步任务GetPersonOrders()
{
var请求=
WebRequest.Create(
“http…”
作为HttpWebRequest;
如果(req==null)返回null;
req.KeepAlive=false;
req.Method=“GET”;
req.ContentType=“text/xml;encoding='utf-8';
WebResponse=req.GetResponse();
Stream receiveStream=response.GetResponseStream();
Encoding encode=Encoding.GetEncoding(“utf-8”);
字符串消息=null;
if(receiveStream!=null)
使用(var readStream=newstreamreader(receiveStream,encode))
{
var结果=新字符[256];
int count=await readStream.ReadAsync(结果为0,256);
而(计数>0)
{
var值=新字符串(结果,0,计数);
消息+=值;
count=wait readStream.ReadAsync(结果为0,256);
}
var stringReader=新的stringReader(消息);
_modelPersons=新的ObservableCollection();
var xmlTextReader=新的xmlTextReader(stringReader);
xmlTextReader.WhitespaceHandling=WhitespaceHandling.None;
Person=null;
字符串元素=”;
while(xmlTextReader.Read())
{
if(xmlTextReader.NodeType==XmlNodeType.Element)
{
元素=xmlTextReader.Name;
}
else if(xmlTextReader.NodeType==XmlNodeType.Text)
{
开关(元件)
{
案例“名称”:
person=newperson{Name=xmlTextReader.Value};
_modelPersons.Add(person);
打破
}
}
}
}
返回(个人);;
}
因为您的方法返回一个任务
,所以您可以通过属性获得任务的结果
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;
}
但是请记住,访问Result
属性将阻止调用线程,直到任务完成,即直到您收到web响应
另一种方法是使用将延续任务附加到方法返回的任务。延续将属性设置为任务返回的值
private void GetPersonOrders()
{
ModelPersons = _service.GetPersonOrders().Result;
}
我建议你用这个
那么您的代码将如下所示:
private void GetPersonOrders()
{
_service.GetPersonOrders()
.ContinueWith(t => ModelPersons = t.Result);
}
私人INotifyCompletion\u人员;
公共INotifyCompletion ModelPersons
{
获取{return\u persons;}
设置
{
_人=价值;
RaisePropertyChanged(()=>ModelPersons);
}
}
私有void GetPersonOrders()
{
ModelPersons=NotifyCompletion.Create(_service.getPersonOrdersSync());
}
您的数据绑定将从modelperson
更改为modelperson.Result
进一步建议如下:
- My及其后续资源,特别是
- 我的博客文章在
\u service.GetPersonOrders()
返回一个任务
而不是ObservableCollection
;任务确实有一个Result
属性。即使签名返回类型是Task,它也允许返回ObservableCollection_modelPersons是ObservaleCollection。@学习者,是的,您可以从方法返回ObservaleCollection
,但方法的调用方无法直接获取它。类似于ObservableCollection c=\u服务.GetPersonOrders()代码>将不会编译。
private void GetPersonOrders()
{
_service.GetPersonOrders()
.ContinueWith(t => ModelPersons = t.Result);
}
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());
}