1

我正在尝试为 Windows Phone 8 编写一个库,并且想知道是否可以使用 await 关键字在不使用回调的情况下使用 JSON?还是我误解了它的工作原理?

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

string result = Library.Ping(var1, var2);

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

4

2 回答 2

6

如果网站出现故障,请参阅链接答案:

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";} }
    }

}

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

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(); 
    } 
}

然后将其称为:

Tweet myTweet = await GetTweet(tweetID);

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

于 2012-12-17T00:27:03.367 回答
3

你可以非常接近那个。你最终得到的是:

 string result = await Library.PingAsync(var1, var2);

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

 public static async Task<string> PingAsync(MyType1 var1, MyType2 var2)
 {
   var client = new WebClient();
   var stringResult = client.DownloadStringTaskAsync(..);
   return JSON.Parse(stringResult).Whatever;
 }
于 2012-12-14T02:15:53.473 回答