locked
关于webclient异步下载的问题 RRS feed

  • 问题

  • 我的程序在打开的时候需要先用WebClient下载数据,然后保存到独立存储,再读取独立存储中的数据填充到UI上,但是WebClient是异步下载,所以填充数据的方法可能会在下载还没有完成的时候就开始执行读取数据的方法,这样就会造成错误。有什么办法能够在确定下载完成后再执行其他方法?不想把所有的东西都写到DownloadStringCompleted事件去。求大神指点。

    谢谢大家。

    2012年7月13日 3:14

答案

  • 你好,

    除了将填充数据代码写到DownloadStringCompleted方法中之外,你也可以考虑进行数据绑定。

    主要思想是将前台的控件绑定到后台的某个属性property中,然后在DownloadStringCompleted方法中对后台的这个属性进行赋值,同时后台的类需要实现INotifyPropertyChanged接口,从而使得每当后台的属性值改变就会自动反映到前台的空间中,这样就不用担心异步的事情。

        public partial class MainPage : UserControl, INotifyPropertyChanged
        {
            public MainPage()
            {
                InitializeComponent();
                WebClient client = new WebClient();
                client.DownloadStringAsync(new Uri("XXX"));
                client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
            }
    
            void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                A = e.Result;
            }
    
            private string a;
    
            public string A
            {
                get { return a; }
                set
                {
                    a = value;
                    NotifyPropertyChanged("A"); 
                 }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void NotifyPropertyChanged(string Member)
            {
                if (PropertyChanged != null)
                    this.PropertyChanged(this, new PropertyChangedEventArgs(Member));
            }
        }

    xaml

     <TextBox Text="{Binding A, Mode=TwoWay}"  />

    • 已标记为答案 Shi Ding 2012年7月23日 18:12
    2012年7月16日 3:23