Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从异步方法获取复杂类型_C#_Asynchronous - Fatal编程技术网

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及其后续资源,特别是
  • 我的博客文章在

因此,这将破坏使用async.ObservableCollection的目的。ObservableCollection也没有.Result。@学习者,请参阅编辑部分,了解从任务中获取结果的另一种方法。关于“ObservableCollection也没有.Result”-
\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());
}