首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有等待的Windows Phone 8异步JSON

带有等待的Windows Phone 8异步JSON
EN

Stack Overflow用户
提问于 2012-12-14 07:55:16
回答 2查看 7.7K关注 0票数 1

我正在尝试为Windows Phone 8编写一个库,我想知道是否可以使用await关键字在不使用回调的情况下使用JSON?或者我搞错了它是如何工作的?

从本质上讲,我希望应用程序能够说:

代码语言:javascript
复制
string result = Library.Ping(var1, var2);

该库连接到web服务,并将JSON中的内容反序列化为动态对象。然后,它将其返回给向库发送请求的主应用程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-17 08:27:03

有关网站宕机的链接答案,请参阅:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace Win8WinPhone.CodeShare.Extensions
{
    public static class HttpExtensions
    {
        public static Task<Stream> GetRequestStreamAsync(this HttpWebRequest request)
        {
            var taskComplete = new TaskCompletionSource<Stream>();
            request.BeginGetRequestStream(ar =>
            {
                Stream requestStream = request.EndGetRequestStream(ar);
                taskComplete.TrySetResult(requestStream);
            }, request);
            return taskComplete.Task;
        }

        public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request)
        {
            var taskComplete = new TaskCompletionSource<HttpWebResponse>();
            request.BeginGetResponse(asyncResponse =>
            {
                try
                {
                    HttpWebRequest responseRequest = (HttpWebRequest)asyncResponse.AsyncState;
                    HttpWebResponse someResponse = (HttpWebResponse)responseRequest.EndGetResponse(asyncResponse);
                    taskComplete.TrySetResult(someResponse);
                }
                catch (WebException webExc)
                {
                    HttpWebResponse failedResponse = (HttpWebResponse)webExc.Response;
                    taskComplete.TrySetResult(failedResponse);
                }
            }, request);
            return taskComplete.Task;
        }
    }

    public static class HttpMethod
    {
        public static string Head { get{return "HEAD";} }
        public static string Post { get{return "POST";} }
        public static string Put { get{return "PUT";} }
        public static string Get { get{return "GET";} }
        public static string Delete { get{return "DELETE";} }
        public static string Trace { get{return "TRACE";} }
        public static string Options { get{return "OPTIONS";} }
        public static string Connect { get{return "CONNECT";} }
        public static string Patch { get{return "PATCH";} }
    }

}

然后你可以把你的函数写成:

代码语言:javascript
复制
public async Task<string> GetMyData(string urlToCall) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlToCall);
    request.Method = HttpMethod.Get;
    HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
    using (var sr = new StreamReader(response.GetResponseStream())) 
    { 
        return sr.ReadToEnd(); 
    } 
}

然后将其称为:

代码语言:javascript
复制
Tweet myTweet = await GetTweet(tweetID);

所有功劳都归于:@robertftw链接到:http://www.windowsphonegeek.com/news/windows-8---windows-phone-code-sharing-httpwebrequest-getresponseasync

票数 6
EN

Stack Overflow用户

发布于 2012-12-14 10:15:53

您可以非常接近这一点。你最终得到的结果是:

代码语言:javascript
复制
 string result = await Library.PingAsync(var1, var2);

首先,安装Microsoft.Bcl.Async。你的Library.PingAsync会有这样的结构:

代码语言:javascript
复制
 public static async Task<string> PingAsync(MyType1 var1, MyType2 var2)
 {
   var client = new WebClient();
   var stringResult = client.DownloadStringTaskAsync(..);
   return JSON.Parse(stringResult).Whatever;
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13870649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档