Я новичок в C# и использую Task
. Я пытался запустить это приложение, но мое приложение зависает каждый раз. Когда я добавляю task.wait()
, он продолжает ждать и никогда не возвращается. Буду признателен за любую оказанную помощь. EDIT: Я хочу вызвать DownloadString асинхронно. И когда я выполняю task.Start(), как предложил «Остин Салонен», я не получаю адрес местоположения, но значение по умолчанию в строке местоположения от returnVal. Это означает, что местоположение получило значение, назначенное до завершения задачи. Как я могу убедиться, что после того, как задача будет завершена, тогда местоположение будет присвоено returnVal.Использование приложения Task.wait() зависает и никогда не возвращает
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");
}
}
}
Я хочу назвать DownloadString асинхронно. И когда я делаю task.Start(); Я не получаю адрес местоположения, но значение по умолчанию в строке местоположения от returnVal. Это означает, что местоположение получило значение, назначенное до завершения задачи. Как я могу убедиться, что после того, как задача будет завершена, тогда местоположение будет присвоено returnVal. – PhantomM
@ Аустин, не могли бы вы объяснить, что стоит за этим поведением? то есть код задачи запускается при простом вызове без StartNew, но никогда не возвращается с первого 'ожидания '. –