【问题标题】:Returning an object from a service call in Silverlight从 Silverlight 中的服务调用返回对象
【发布时间】:2011-09-01 04:55:57
【问题描述】:

我需要在 Silverlight 库中实现一个方法,该方法通过 httpwebrequest 调用(非 wcf-)服务,获取响应,然后填充一个对象并返回它。

因为这是 Silverlight,响应是异步返回的,所以我无法确定该对象应填充到何处以及应如何返回。

这是我目前的代码:

    public MyObject GetMyObject 
    {
        HttpWebRequest req = WebRequest.Create(MyUri) as HttpWebRequest;
        req.Method = "GET";
        req.Accept = "application/json";

        req.BeginGetResponse((cb) =>
        {
            HttpWebRequest rq = cb.AsyncState as HttpWebRequest;
            HttpWebResponse resp = rq.EndGetResponse(cb) as HttpWebResponse; 
            string result;
            using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
            {
                result = reader.ReadToEnd();
                reader.Close();
            }                
        }, req);

    }

我认为我可以在执行 reader.ReadToEnd() 之后立即填充该对象,但我实际上在哪里返回它?我不能在回调函数中返回它,但是如果我在 GetMyObject() 结束时返回它,则不能保证从异步回调开始填充该对象。

提前致谢!

【问题讨论】:

    标签: silverlight httpwebrequest


    【解决方案1】:

    首先您需要认识到,当一个操作序列(我们通常称为“代码”)包含一个异步完成的操作时,整个序列实际上是异步的。

    在同步世界中,我们有返回指定类型的函数。在异步世界中,这些函数返回 void,而是将委托传递给它们以被调用(我们称它们为回调),其中委托接受指定类型的参数。

    由于您的函数在内部步入异步世界,所以它也必须(因为它已成为现在异步序列的一部分)。所以它的签名需要改变。它现在看起来像这样:-

        public void GetMyObject(Action<MyObject> returnResult)
        {
            HttpWebRequest req = WebRequest.Create(MyUri) as HttpWebRequest;
            req.Method = "GET";
            req.Accept = "application/json";
    
            req.BeginGetResponse((cb) =>
            {
                WebResponse resp = req.EndGetResponse(cb);
                string json;
                using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
                {
                    json = reader.ReadToEnd();
                    reader.Close();
                }
                MyObject result = SomethingDoDeserialiseJSONToMyObject(json);
                returnResult(result);
            }, null);
    
        }
    

    然后您将使用以下方法调用此方法:-

      GetMyObject(result => 
      {
           Dispatcher.BeginInvoke(() =>
           {
                //  Display result in UI
           });
      });
    

    【讨论】:

    • 非常感谢您的详细解释和示例。真的很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多