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

Soy nuevo en C # y estoy usandoTask. Estaba intentando ejecutar esta aplicación, pero mi aplicación se bloquea cada vez. Cuando estoy agregandotask.wait(), sigue esperando y nunca vuelve. Cualquier ayuda es muy apreciada. EDITAR: Quiero llamar a DownloadString de forma asíncrona. Y cuando estoy haciendo task.Start () como lo sugiere "Austin Salonen", no obtengo la dirección de la ubicación, sino el valor predeterminado en la cadena de ubicación de returnVal. Significa que la ubicación tiene un valor asignado antes de que se complete la tarea. ¿Cómo puedo asegurarme de que después de que se complete la tarea solo se asigne el valor de retorno 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");
                    }
                }
            }

Respuestas a la pregunta(2)

Su respuesta a la pregunta