代码之家  ›  专栏  ›  技术社区  ›  H4mm3rHead

Silverlight跨线程UI更新问题

  •  3
  • H4mm3rHead  · 技术社区  · 15 年前

    我有这门课:

    public class UploadFile : INotifyPropertyChanged {
        private string name;
        public string Name {
            get {
                return name;
            }
            set {
                name = value;
                OnPropertyChanged("Name");
            } 
        }
    
        private FileInfo fileInfo;
        public FileInfo FileInfo { get; set; }
    
        private string length;
        public string Length {
            get {
                return length;
            }
            set {
                length = value;
                OnPropertyChanged("Length");
            }  
        }
    
        private int percentage;
        public int Percentage {
            get {
                return percentage;
            }
            set {
                percentage = value;
                OnPropertyChanged("Percentage");
            } 
        }
    
        public string ProgressValue {
            get { return string.Format("{0}%", Percentage); }
        }
    
        private string imageSource;
        public string ImageSource {
            get {
                return imageSource;
            }
            set {
                imageSource = value;
                OnPropertyChanged("ImageSource");
            }  
        }
    
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    
        private void OnPropertyChanged(string property) {
            if (PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
    

    我正在尝试创建一个文件上载,它可以进行大型和多个文件上载。我正在使用Web服务进行此操作。我在我的用户界面中进行了双向绑定,现在我想上传文件。我用这个代码来做这个

    private void DoUpload() {
            foreach (UploadFile file in fileInfos){
                int BUFFERSIZE = 1024;
                int offset = 0; //get from webservice, when partial file
                FileStream s = file.FileInfo.OpenRead();
                byte[] buffer = null;
                long remainingBytes = s.Length - offset;
                while (remainingBytes > 0) {
                    if (remainingBytes < BUFFERSIZE) {
                        buffer = new byte[remainingBytes];
                        BUFFERSIZE = (int)remainingBytes;
                    }
                    else if (remainingBytes > BUFFERSIZE) {
                        buffer = new byte[BUFFERSIZE];
                    }
    
                    s.Read(buffer, 0, BUFFERSIZE);
                    //push to webservice
                    Thread.Sleep(20);
                    //UploadService.Service1SoapClient client = new MultiLargeFileUpload.UploadService.Service1SoapClient();
                    //client.LargeUploadCompleted +=new EventHandler<AsyncCompletedEventArgs>(client_LargeUploadCompleted);
                    //client.LargeUploadAsync(1, buffer, file.Name);
                    offset += BUFFERSIZE;
                    int newPercentage = offset / (int)file.FileInfo.Length * 100;
                    file.Percentage = newPercentage;
                    remainingBytes = s.Length - offset;                    
                }
                //file.Percentage = 100;
                //file.ImageSource = "accept.png";
            }
        }
    

    问题是我无法更新UI或跨线程操作。我试图使用一个调度员,但我没有成功,因为我不知道在哪里插入它。

    1 回复  |  直到 12 年前
        1
  •  5
  •   Jan Jongboom    15 年前

    我猜你是在尝试更新你的用户界面

               file.Percentage = newPercentage;
               remainingBytes = s.Length - offset;
    

    您必须将其包装在委托中,并在此基础上执行Dispatcher.BeginInvoke以从其他线程更新您的UI:

    Dispatcher.BeginInvoke(()=>{
        file.Percentage=newPercentage;
        remainingBytes = s.Length - offset;
    });
    

    通过这种方式,您向主线程上的消息队列发送消息,并且主线程可以在委托有时间时执行该委托。