Windows Phone 利用Async CTP实现异步加载数据

Async CTP是个好东西额,就是安装的时候比较坑…

跟N多补丁冲突,只要安装顺序对了才能顺利装上…

可以参考下以前写的:http://www.cnblogs.com/sun8134/archive/2011/09/19/2181030.html

 

异步是个好东西,可以让后台数据操作时前台也有反应而不是卡死

安装好Async CTP后,只要在wp项目中引用AsyncCtpLibrary_Phone.dll就可以使用async和await来实现异步加载了

MS已经封装好了一些异步操作,比如WebClient里就可以直接使用:

Uri ui = new Uri(urls);
System.Net.WebClient wc1 = new System.Net.WebClient();
string txs = await wc1.DownloadStringTaskAsync(ui);

 

下面来介绍下如何自己使用async和await来实现异步加载数据

实例中我们的目的是加载一个xml,并将数据绑定到listbox上来

首先我随便找了个学生成绩的XML

image

 

然后制作一个数据类students.cs

image

 

然后再编辑下listbox的绑定模板:

image

 

然后我们还需要一个ProgressIndicator,好在加载数据时给用户一个提示,我比较偷懒一直在用别人现成的一个东东

image

关于咋用这个东东大家去看作者的介绍吧:

http://www.jeff.wilcox.name/2011/07/creating-a-global-progressindicator-experience-using-the-windows-phone-7-1-sdk-beta-2/

http://www.cnblogs.com/alexis/archive/2011/09/04/2165994.html

大概效果:

image

 

前台的东西大体差不多了

下面主要是code behind里的代码事件了

首先我们要写一个方法来从xml中读取数据

        private ObservableCollection<students> loaddata()
        {
            XDocument xdoc = XDocument.Load("data.xml");
            ObservableCollection<students> studentsdataCollection = new ObservableCollection<students>();
            foreach (XElement element in xdoc.Element("学生成绩单").Descendants("学生成绩"))
            {     
                studentsdataCollection.Add(new students()
                {
                    stu_No = element.Element("学号").Value,
                    stu_Name = element.Element("姓名").Value,
                    stu_English = element.Element("外语").Value,
                    stu_Mathematic = element.Element("高等数学").Value,
                    stu_Physics = element.Element("大学物理").Value,
                    stuno_Politics = element.Element("政治").Value,
                    stu_Sports = element.Element("体育").Value,
                    stu_Total = element.Element("总分").Value
                });
            }
            //Thread.Sleep(5000);
            return studentsdataCollection;
        }

 

然后在页面加载事件里用async和await来实现异步调用这个方法,并将数据绑定到listbox上

        private async void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            GlobalIndicator.Instance.BusyForWork("正在加载数据,请稍候...");
            ObservableCollection<students> d1=await Task<ObservableCollection<students>>.Factory.StartNew(new Func<ObservableCollection<students>>(loaddata));
            base.Dispatcher.BeginInvoke(() =>
            {
                listbox1.ItemsSource = d1;
            });
 
            GlobalIndicator.Instance.WorkDone();
        }

 

其实很简单,看看大概效果(由于读取XML比较快,所以我加了Thread.Sleep(5000); 由于是异步加载,所以加载过程中可以正常切换Pivot Item):

imageimageimage

 

大概就在这么多,更多信息将看:

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

http://www.wintellect.com/CS/blogs/jgarland/archive/2011/04/18/new-for-windows-phone-now-the-async-ctp.aspx

http://www.cnblogs.com/cracker/archive/2012/08/13/WindowsPhone_AsyncCTP.html#2448086

http://blogs.msdn.com/b/kevinash/archive/2012/02/21/async-ctp-task-based-asynchronous-programming-for-windows-phone.aspx

http://blogs.msdn.com/b/lucian/archive/2012/03/25/asyncctp-installation-problems-and-vs11.aspx

http://blogs.msdn.com/b/lucian/archive/2011/05/20/talk-how-to-write-an-async-connected-app-for-windows-phone-7.aspx

 

 

完整实例:

posted @ 2012-10-12 17:27  sun8134  阅读(1036)  评论(0编辑  收藏  举报
分享按钮