title: Using Task.wait() application hangs and never returns
body: <p>I am new to C# and using <code>Task</code>. I was trying to run this application but my application hangs every time. When I am adding <code>task.wait()</code>, it keeps waiting and never returns. Any help is much appreciated.
  EDIT:
  I want to call DownloadString Asynchronously. And when I am doing task.Start() as suggested by "Austin Salonen" I don't get the address of location but default value in location string from returnVal. It means that location got value assigned before task got completed. How can I make sure that after task is completed only then location gets assigned returnVal.     </p>
  
  <pre><code>public class ReverseGeoCoding
          {
                  static string baseUri = "http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&amp;sensor=false";
                  string location = "default";
                  static string returnVal = "defaultRet";
                  string latitude = "51.962146";
                  string longitude = "7.602304";
                  public string getLocation()
                  {
                      Task task = new Task(() =&gt; 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");
                      }
                  }
              }
  </code></pre>