2009-11-14 68 views
3

我有这个类:Silverlight的跨线程UI更新问题

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,或横纱操作这样做。我试图使用Dispatcher,但是我没有成功,因为我不知道在哪里插入它。

回答

5

我猜你想要做你的UI的更新中

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

你必须在一个委托来包装这一点,并做了Dispatcher.BeginInvoke这个从另一个更新UI螺纹:

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

这样你将消息发送到主线程的消息队列,主线程可以执行委托时,他有时间。