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

时间:2011-05-17 02:31:40

标签: 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()
                                     {
                                      .........
                                     }
            }

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

1 个答案:

答案 0 :(得分: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它从你的代码开始看起来合理且应该有效,解释了一些问题和解决方法。如何让它发挥作用。