从Web服务填充WP7列表会导致"无效的跨线程访问".

Div*_*Dan 1 windows-phone-7

很抱歉,如果这是一个简单的问题,但我对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()
                                     {
                                      .........
                                     }
            }
Run Code Online (Sandbox Code Playgroud)

我在这里做过一些非常愚蠢的事吗?

Chr*_*nty 7

当您从请求回来时,您不再在UI线程上.因此,在执行任何会影响UI的操作之前,您需要将控制权切换回UI线程.

您正在更新ObservableCollection,它将绑定在UI上,因此更新将影响UI.

有许多方法,对您来说最简单

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

编辑:此外,如果你想了解更多关于这一点,我有一篇关于它的博客文章http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html它从代码开始你看起来很合理,应该工作,解释一些问题,以及如何让它运作.