如何让普通的WebRequest异步和等待?

我需要使以下代码异步和等待。

我需要从Web服务器获取大量数据,然后这些数据将用于填充我的应用程序中的xaml页面。

所以,我需要DefLogin()方法是可以接受的。

可能吗?

public void DefLogin() { postData = "My Data To Post"; var url = new Uri("Url To Post to", UriKind.Absolute); webRequest = WebRequest.Create(url); webRequest.Method = "POST"; webRequest.ContentType = "text/xml"; webRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest); } public void GetRequestStreamCallback(IAsyncResult asynchronousResult) { webRequest = (HttpWebRequest)asynchronousResult.AsyncState; Stream postStream = webRequest.EndGetRequestStream(asynchronousResult); byte[] byteArray = Encoding.UTF8.GetBytes(postData); postStream.Write(byteArray, 0, byteArray.Length); postStream.Close(); Debug.WriteLine("Start BEGINGetResponse"); webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest); } public void GetResponseCallback(IAsyncResult asynchronousResult) { try { HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; HttpWebResponse response; response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); Stream streamResponse = response.GetResponseStream(); StreamReader streamReader = new StreamReader(streamResponse); string Response = streamReader.ReadToEnd(); streamResponse.Close(); streamReader.Close(); response.Close(); if (Response == "") { //show some error msg to the user Debug.WriteLine("ERROR"); } else { //Your response will be available in "Response" Debug.WriteLine(Response); } } catch (WebException) { //error } } 

我在StackOverflow上看到了这个问题: 使用Async和Await转换普通的Http Post Web请求 ,但我无法正确理解答案。

请任何人可以帮忙吗? 我真的很感激!

你可以使用TaskFactory.FromAsync 将APM转换为TAP ,制作了许多这样的微小扩展方法:

 public static Task GetRequestStreamAsync(this WebRequest request) { return TaskFactory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null); } 

并对WebRequest.GetResponse和(如有必要) Stream.WriteStream.Flush等做同样的Stream.Flush

然后你可以使用async编写你的实际逻辑并await没有任何回调:

 public async Task DefLoginAsync() { postData = "My Data To Post"; var url = new Uri("Url To Post to", UriKind.Absolute); webRequest = WebRequest.Create(url); webRequest.Method = "POST"; webRequest.ContentType = "text/xml"; using (Stream postStream = await webRequest.GetRequestStreamAsync()) { byte[] byteArray = Encoding.UTF8.GetBytes(postData); await postStream.WriteAsync(byteArray, 0, byteArray.Length); await postStream.FlushAsync(); } try { string Response; using (var response = (HttpWebResponse)await webRequest.GetResponseAsync()); using (Stream streamResponse = response.GetResponseStream()) using (StreamReader streamReader = new StreamReader(streamResponse)) { Response = await streamReader.ReadToEndAsync(); } if (Response == "") { //show some error msg to the user Debug.WriteLine("ERROR"); } else { //Your response will be available in "Response" Debug.WriteLine(Response); } } catch (WebException) { //error } }