2013-02-22 23 views
7

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"); 
        } 
       } 
      } 

Trả lời

2

Tôi không hiểu tại sao bạn sử dụng sự kiện DownloadStringCompleted và cố gắng biến nó thành chặn. Nếu bạn muốn chờ đợi kết quả, chỉ cần sử dụng chặn cuộc gọi 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"; 
} 

Nếu bạn muốn làm cho nó async

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); 
    } 
} 
10

Bạn chưa thực sự đang chạy tác vụ. Gỡ lỗi và kiểm tra task.TaskStatus sẽ hiển thị điều này.

// this should help 
task.Start(); 

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

Mặc dù nếu bạn đang chặn, tại sao bắt đầu một chuỗi khác để bắt đầu?

+0

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

+0

@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. –

Các vấn đề liên quan