H4m*_*ead 3 silverlight multithreading
我有这门课:
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个能够进行大量和多个文件上传的文件上传.我正在使用Web服务.我在我的UI中进行了双向绑定,现在我想上传文件.我正在使用此代码执行此操作
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";
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法更新UI或跨线程操作.我尝试使用Dispatcher,但我没有成功,因为我不知道在哪里插入它.
我想你正在尝试更新你的用户界面
file.Percentage = newPercentage;
remainingBytes = s.Length - offset;
Run Code Online (Sandbox Code Playgroud)
您必须将其包装在委托中,并对此执行Dispatcher.BeginInvoke以从另一个线程更新您的UI:
Dispatcher.BeginInvoke(()=>{
file.Percentage=newPercentage;
remainingBytes = s.Length - offset;
});
Run Code Online (Sandbox Code Playgroud)
这样,您就可以向主线程上的消息队列发送消息,主线程可以在有时间时执行委托.
| 归档时间: |
|
| 查看次数: |
1989 次 |
| 最近记录: |