Заполнение списка WP7 из веб-службы вызывает «Недопустимый межпоточный доступ». - PullRequest
1 голос
/ 17 мая 2011

Извините, если это простой вопрос, но я новичок в WP7.У меня есть служба отдыха, которую я пытаюсь использовать, однако я получаю сообщение об ошибке «Неверный межпоточный доступ».

Это мой код

   public ObservableCollection<TransactionViewModel> Transactions { get;private set; }
   public MainViewModel()
    {
        this.Transactions = new ObservableCollection<TransactionViewModel>();
    }
    public void LoadTransactions(string id)
    {
        var req = (HttpWebRequest)WebRequest.Create(string.Format("http://domain.com/Transactions?Id={0}", id));
            req.Method = "POST";
            req.ContentType = "application/json; charset=utf-8";

           // call async
            req.BeginGetResponse(new AsyncCallback(jsonGetRequestStreamCallback), req);


        this.IsDataLoaded = true;

    }

    void jsonGetRequestStreamCallback(IAsyncResult asynchronousResult)
    {

        WebResponse response = ((HttpWebRequest)asynchronousResult.AsyncState).EndGetResponse(asynchronousResult);
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            string responseString = reader.ReadToEnd();
            reader.Close();


            var s = JsonConvert.DeserializeObject<List<TransactionViewModel>>(responseString);

            foreach (var t in s)
            {
                Transactions.Add(new TransactionViewModel()
                                     {
                                      .........
                                     }
            }

Я сделал здесь что-то действительно глупое?

1 Ответ

7 голосов
/ 17 мая 2011

Когда вы возвращаетесь из запроса, вы больше не в потоке пользовательского интерфейса. Поэтому вам необходимо переключить управление обратно в поток пользовательского интерфейса, прежде чем выполнять какие-либо действия, которые будут влиять на пользовательский интерфейс.

Вы обновляете коллекцию ObservableCollection, которая будет привязана к пользовательскому интерфейсу, и, следовательно, обновление повлияет на пользовательский интерфейс.

Есть несколько подходов, самые простые для вас цели будут

<code>Deployment.Current.Dispatcher.BeginInvoke(()=> {
 foreach (var t in s) {
  Transactions.Add(new TransactionViewModel());
 }
});

Редактировать: Также, если вы хотите прочитать немного больше об этом, у меня есть пост в блоге об этом здесь http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html он начинается с кода, подобного вашему, который выглядит разумным и должен работать, объясняет несколько ошибок и как заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...