Tôi mới sử dụng C# và đang sử dụng Task
. Tôi đã cố chạy ứng dụng này nhưng ứng dụng của tôi bị treo mọi lúc. Khi tôi thêm task.wait()
, nó sẽ tiếp tục chờ và không bao giờ trả lại. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao. EDIT: Tôi muốn gọi cho DownloadString Không đồng bộ. Và khi tôi đang làm task.Start() như đề xuất bởi "Austin Salonen" Tôi không nhận được địa chỉ của vị trí nhưng giá trị mặc định trong chuỗi vị trí từ returnVal. Nó có nghĩa là vị trí có giá trị được giao trước khi nhiệm vụ hoàn thành. Làm thế nào tôi có thể chắc chắn rằng sau khi nhiệm vụ được hoàn thành chỉ sau đó vị trí được gán returnVal.Sử dụng ứng dụng Task.wait() treo và không bao giờ trả lại
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");
}
}
}
Tôi muốn gọi DownloadString không đồng bộ. Và khi tôi đang làm task.Start(); Tôi không nhận được địa chỉ của vị trí nhưng giá trị mặc định trong chuỗi vị trí từ returnVal. Nó có nghĩa là vị trí có giá trị được giao trước khi nhiệm vụ hoàn thành. Làm thế nào tôi có thể chắc chắn rằng sau khi nhiệm vụ được hoàn thành chỉ sau đó vị trí được gán returnVal. – PhantomM
@Austin, bạn có thể giải thích những gì đằng sau hành vi này không? tức là mã của Tác vụ chạy khi được gọi đơn giản mà không có StartNew, nhưng không bao giờ trả lại từ «await' đầu tiên. –