2010-10-26 11 views
8

Básicamente, estoy obteniendo datos de un WebService, y en ResponseCallback intento llenar un ObservableCollection con los resultados que obtuve de la respuesta, pero obtengo un UnauthorizedAccessException "Acceso de hilos cruzados no válido" cuando intento hacerlo.Problema de acceso a subprocesos cruzados en ResponseCallback en Windows Phone 7

¿Cuál sería la mejor manera de llenar dicha colección observable cuando obtenga el resultado?

Gracias!

Este es el código:

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

Respuesta

2
+0

Gracias por la sugerencia, pero no estoy muy seguro de poner esta solución en el código de producción. – Carlo

+0

Aparentemente, la solución no funciona en Windows Phone 7. No dije que esto era lo que estaba usando al principio, pero ahora lo agregué al título/etiquetas. Gracias. – Carlo

+0

gotcha. No tengo experiencia con el teléfono 7 ... ¡así que buena suerte! – climbage

1

Si desea actualizar la interfaz de usuario (incluso de forma indirecta a través de una colección observado) desde otro hilo que acaba necesita utilizar el despachador de la siguiente manera:

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

Sí, la cuestión es que el código que publiqué está en mi modelo de vista, y no quiero hacer que mi modelo de vista herede de DependencyObject solo para eso. Estamos tratando de mantener la memoria baja, y DependencyObject son muy costosos en recursos. – Carlo

14

Tengo exactamente el mismo problema en WP7. Se puede resolver con el código sugerido por Mick N y sin necesidad de heredar de DO. Simplemente tome un despachador de la clase de implementación estática.

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

Pero esto me parece raro tipo de solución, nunca he tienen que hacer esto en Silverlight escritorio.

¿Es este WP7 específico o hay alguna solución mejor? Gracias.

+0

Es específico de WP7. Lo que hice es que estoy enviando el despachador del UserControl que llamó al método ViewModel.Load(). Parece que: App.MainViewModel.Load (this.Dispatcher); y dentro utilizo ese despachador para hacer la operación de sincronización, no estoy seguro si es la mejor manera, pero funciona. – Carlo

+0

Bueno, con el enfoque anterior, no necesita pasar nada. Siempre hay un despachador esperándolo en esa clase de implementación. De cualquier forma, esto significa que dado que nuestras aplicaciones están basadas en Internet, nuestro código estará lleno de despachadores, ¿estoy en lo cierto? – jumbo

+0

Ok, con las descargas de WebClient todo funciona bien (el recopilado de NotableCollection se completa sin necesidad de Dispatcher), pero cuando uso RestSharp lib (para WP7), tengo que completar el ObsColl a través de Dispatcher. – jumbo