c# google-api task wait reverse-geocoding

c# - El uso de la aplicación Task.wait() se bloquea y nunca vuelve



google-api reverse-geocoding (2)

Soy nuevo en C # y uso de Task . Estaba intentando ejecutar esta aplicación, pero mi aplicación se cuelga todo el tiempo. Cuando agrego task.wait() , sigue esperando y nunca regresa. Cualquier ayuda es muy apreciada. EDITAR: Quiero llamar a DownloadString de forma asincrónica. Y cuando estoy haciendo task.Start () como lo sugiere "Austin Salonen" no obtengo la dirección de ubicación sino el valor predeterminado en la cadena de ubicación de returnVal. Significa que la ubicación obtuvo un valor asignado antes de que la tarea se completara. ¿Cómo puedo asegurarme de que después de completar la tarea solo se le asigne returnVal a la ubicación?

public class ReverseGeoCoding { static string baseUri = "http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false"; string location = "default"; static string returnVal = "defaultRet"; string latitude = "51.962146"; string longitude = "7.602304"; public string getLocation() { Task task = new Task(() => RetrieveFormatedAddress(latitude, longitude)); //var result = Task.Factory.StartNew(RetrieveFormatedAddress("51.962146", "7.602304")); task.Wait(); //RetrieveFormatedAddress("51.962146", "7.602304"); location = returnVal; return location; } public static void RetrieveFormatedAddress(string lat, string lng) { string requestUri = string.Format(baseUri, lat, lng); using (WebClient wc = new WebClient()) { wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); wc.DownloadStringAsync(new Uri(requestUri)); } } static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { var xmlElm = XElement.Parse(e.Result); var status = (from elm in xmlElm.Descendants() where elm.Name == "status" select elm).FirstOrDefault(); if (status.Value.ToLower() == "ok") { var res = (from elm in xmlElm.Descendants() where elm.Name == "formatted_address" select elm).FirstOrDefault(); //Console.WriteLine(res.Value); returnVal = res.Value; } else { returnVal = "No Address Found"; //Console.WriteLine("No Address Found"); } } }


En realidad no estás ejecutando la tarea. task.TaskStatus depuración y comprobación. task.TaskStatus mostraría esto.

// this should help task.Start(); // ... or this: Task.Wait(Task.Factory.StartNew(RetrieveFormatedAddress("51.962146", "7.602304")));

Aunque si estás bloqueando, ¿por qué comenzar con otro hilo para empezar?


No entiendo por qué utilizas el evento DownloadStringCompleted e intento bloquearlo . Si quiere esperar el resultado, simplemente use la llamada de bloqueo DownloadString

var location = RetrieveFormatedAddress(51.962146, 7.602304); string RetrieveFormatedAddress(double lat, double lon) { using (WebClient client = new WebClient()) { string xml = client.DownloadString(String.Format(baseUri, lat, lon)); return ParseXml(xml); } } private static string ParseXml(string xml) { var result = XDocument.Parse(xml) .Descendants("formatted_address") .FirstOrDefault(); if (result != null) return result.Value; else return "No Address Found"; }

Si quieres que sea asincrónico

var location = await RetrieveFormatedAddressAsync(51.962146, 7.602304); async Task<string> RetrieveFormatedAddressAsync(double lat,double lon) { using(HttpClient client = new HttpClient()) { string xml = await client.GetStringAsync(String.Format(baseUri,lat,lon)); return ParseXml(xml); } }