Comment rendre WebRequest ordinaire asynchrone et attendu?

J’ai besoin de rendre le code suivant async et en attente.

J’ai besoin de récupérer beaucoup de données du serveur Web. Ces données seront ensuite utilisées pour renseigner la page xaml dans mon application.

J’ai donc besoin de la méthode DefLogin () pour pouvoir l’attendre.

C’est possible?

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

J’ai vu cette question sur StackOverflow: Convertir une requête Web Http Post classique avec Async et Await , mais je ne pouvais pas comprendre la réponse correctement.

S’il vous plaît quelqu’un peut-il aider? Je serais très reconnaissant!

Vous pouvez utiliser TaskFactory.FromAsync pour convertir APM en TAP , créant ainsi de nombreuses méthodes d’extension minuscules comme celle-ci:

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

et faites de même pour WebRequest.GetResponse et (si nécessaire) Stream.Write , Stream.Flush , etc.

Ensuite, vous pouvez écrire votre logique réelle en utilisant async et await sans aucun rappel:

 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 { ssortingng 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 } }