tasks run parallel getresponseasync example await async c# asynchronous request httprequest downloadstring

run - getresponseasync c# example



DownloadStringAsync espera la finalizaciĆ³n de la solicitud (6)

Estoy usando este código para recuperar un contenido de url:

private ArrayList request(string query) { ArrayList parsed_output = new ArrayList(); string url = string.Format( "http://url.com/?query={0}", Uri.EscapeDataString(query)); Uri uri = new Uri(url); using (WebClient client = new WebClient()) { client.DownloadStringAsync(uri); } // how to wait for DownloadStringAsync to finish and return ArrayList }

Quiero usar DownloadStringAsync porque DownloadString cuelga la GUI de la aplicación, pero quiero poder devolver el resultado a request . ¿Cómo puedo esperar hasta que DownloadStringAsync finalice la solicitud?


¿Por qué querrías esperar ... eso bloqueará la GUI igual que antes?

var client = new WebClient(); client.DownloadStringCompleted += (sender, e) => { doSomeThing(e.Result); }; client.DownloadStringAsync(uri);


¿Realmente desea ESPERAR que se complete un método asíncrono después de iniciarlo en el mismo hilo? ¿Por qué no usar la versión de sincronización entonces?

Debes conectar el evento DownloadStringCompleted y ver el resultado allí. Entonces puedes usarlo como un método Async real.



Con Dot.Net 4.5:

public static async void GetDataAsync() { DoSomthing(await new WebClient().DownloadStringTaskAsync(MyURI)); }


Tuve el mismo problema con WP7. Resolví este método. Aguardar no funciona wp7, pero si usa Acción, devolverá las funciones Async.

public void Download() { DownloadString((result) => { //!!Require to import Newtonsoft.Json.dll for JObject!! JObject fdata= JObject.Parse(result); listbox1.Items.Add(fdata["name"].ToString()); }, "http://graph.facebook.com/zuck"); } public void DownloadString(Action<string> callback, string url) { WebClient client = new WebClient(); client.DownloadStringCompleted += (p, q) => { if (q.Error == null) { callback(q.Result); } }; client.DownloadStringAsync(new Uri(url)); }


esto mantendrá su GUI sensible, y es más fácil de entender IMO:

public static async Task<string> DownloadStringAsync(Uri uri, int timeOut = 60000) { string output = null; bool cancelledOrError = false; using (var client = new WebClient()) { client.DownloadStringCompleted += (sender, e) => { if (e.Error != null || e.Cancelled) { cancelledOrError = true; } else { output = e.Result; } }; client.DownloadStringAsync(uri); var n = DateTime.Now; while (output == null && !cancelledOrError && DateTime.Now.Subtract(n).TotalMilliseconds < timeOut) { await Task.Delay(100); // wait for respsonse } } return output; }