2010-10-26 33 views
8

Về cơ bản, tôi nhận được một số dữ liệu từ WebService và trong ResponseCallback tôi đang cố điền vào ObservableCollection với kết quả tôi nhận được từ phản hồi, nhưng tôi nhận được UnauthorizedAccessException "Truy cập chuỗi chéo không hợp lệ" khi tôi cố gắng làm như vậy.Vấn đề truy cập chuỗi chéo trong ResponseCallback trong Windows Phone 7

Điều gì sẽ là cách tốt nhất để điền vào bộ sưu tập quan sát được khi tôi nhận được kết quả?

Cảm ơn!

Đây là mã:

public ObservableCollection<Person> People { get; set; } 

    private void ResponseCallback(IAsyncResult asyncResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 

     string responseString = string.Empty; 

     using (Stream content = response.GetResponseStream()) 
     { 
      if (request != null && response != null) 
      { 
       if (response.StatusCode == HttpStatusCode.OK) 
       { 
        XDocument document = XDocument.Load(content); 

        var people = from p in document.Descendants() 
          where p.Name.LocalName == "PersonInfo" 
          select Person.GetPersonFromXElement(p); 

        foreach (Person person in people) 
        { 
         this.People.Add(person); // this line throws the exception 
        } 
       } 
      } 

      content.Close(); 
     } 
    } 

Trả lời

2
+0

Cảm ơn bạn đã đề xuất, nhưng tôi không thực sự chắc chắn về việc đưa giải pháp này vào mã sản xuất. – Carlo

+0

Rõ ràng là giải pháp không hoạt động trong Windows Phone 7. Tôi không nói đây là những gì tôi đã sử dụng lúc đầu, nhưng bây giờ tôi đã thêm nó vào tiêu đề/thẻ. Cảm ơn. – Carlo

+0

. Tôi không có kinh nghiệm với điện thoại 7 .. thật may mắn! – climbage

1

Nếu bạn muốn cập nhật giao diện người dùng (thậm chí gián tiếp thông qua một bộ sưu tập quan sát) từ một chủ đề mà bạn vừa cần phải sử dụng điều phối viên như sau:

Dispatcher.BeginInvoke(() => { //your ui update code }); 
+0

Vâng, điều là mã tôi đăng là trong mô hình xem của tôi, và tôi không muốn làm cho mô hình xem của tôi kế thừa từ DependencyObject chỉ cho điều đó. Chúng tôi đang cố gắng giữ bộ nhớ ở mức thấp và DependencyObject rất tốn kém. – Carlo

14

Tôi có cùng một vấn đề về WP7. Nó có thể được giải quyết bằng mã Mick N được đề xuất và không cần phải kế thừa từ DO. Chỉ cần lấy một Dispatcher từ lớp Deployment tĩnh.

Deployment.Current.Dispatcher.BeginInvoke(() => { //your ui update code });

Nhưng điều này dường như tôi giải pháp loại kỳ lạ, tôi đã không bao giờ phải làm điều này trong Silverlight desktop.

Đây có phải là WP7 cụ thể hoặc có giải pháp nào tốt hơn không? Cảm ơn.

+0

Nó là WP7 cụ thể. Những gì tôi đã làm là tôi gửi điều phối viên của UserControl gọi là phương thức ViewModel.Load(). Có vẻ như: App.MainViewModel.Load (this.Dispatcher); và bên trong tôi sử dụng bộ điều phối đó để thực hiện thao tác không đồng bộ, không chắc đó có phải là cách tốt nhất hay không, nhưng nó hoạt động. – Carlo

+0

Vâng, với cách tiếp cận ở trên, bạn không cần phải vượt qua bất cứ điều gì. Luôn có một Dispatcher đang chờ bạn trong lớp Deployment đó. Dù bằng cách nào, điều này có nghĩa rằng kể từ khi ứng dụng của chúng tôi là dựa trên internet, mã của chúng tôi sẽ được đầy đủ của Dispatchers, tôi phải không? – jumbo

+0

Ok, với tải xuống WebClient hoạt động mọi thứ ok (ràng buộc ObservableCollection được lấp đầy mà không cần Dispatcher), nhưng khi tôi sử dụng RestSharp lib (cho WP7), tôi phải điền vào ObsColl thông qua Dispatcher. – jumbo