Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cross thread access problem in ResponseCallback in Windows Phone 7

Basically, I'm getting some data from a WebService, and in the ResponseCallback I'm trying to fill an ObservableCollection with the results I got from the response, but I get an UnauthorizedAccessException "Invalid cross-thread access" when I try to do so.

What would be the best way to fill said observable collection when I get the result?

Thanks!

This is the code:

    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();
        }
    }
like image 410
Carlo Avatar asked Oct 26 '10 21:10

Carlo


2 Answers

I have exactly same problem on WP7. It can be solved by the code Mick N suggested and with no need to inheriting from DO. Just take a Dispatcher from static Deployment class.

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

But this seems to me kind of weird solution, I've never have to do this in desktop Silverlight.

Is this WP7 specific or is there some better solution? Thanks.

like image 171
jumbo Avatar answered Sep 24 '22 02:09

jumbo


You might want to have a look at this http://codeblitz.wordpress.com/2009/05/27/handling-cross-threading-in-observablecollection/

like image 35
Mike Park Avatar answered Sep 25 '22 02:09

Mike Park