Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight跨线程ui更新问题_Silverlight_Multithreading - Fatal编程技术网

Silverlight跨线程ui更新问题

Silverlight跨线程ui更新问题,silverlight,multithreading,Silverlight,Multithreading,我有这门课: public class UploadFile : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); }

我有这门课:

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服务来完成这项工作。我在我的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";
        }
    }
private void DoUpload(){
foreach(在fileInfos中上载文件){
int BUFFERSIZE=1024;
int offset=0;//从webservice获取部分文件时
FileStream s=file.FileInfo.OpenRead();
字节[]缓冲区=空;
long remainingBytes=s.长度-偏移量;
而(剩余字节数>0){
if(剩余字节数<缓冲区大小){
缓冲区=新字节[剩余字节];
BUFFERSIZE=(int)剩余字节数;
}
else if(remainingBytes>BUFFERSIZE){
buffer=新字节[BUFFERSIZE];
}
s、 读取(缓冲区,0,缓冲区大小);
//推送到Web服务
睡眠(20);
//UploadService.Service1SoapClient=new MultiLargeFileUpload.UploadService.Service1SoapClient();
//client.LargeUploadCompleted+=新事件处理程序(client\u LargeUploadCompleted);
//LargeUploadAsync(1,buffer,file.Name);
偏移量+=缓冲区大小;
int newPercentage=offset/(int)file.FileInfo.Length*100;
file.Percentage=newPercentage;
remainingBytes=s.长度-偏移量;
}
//百分比=100;
//file.ImageSource=“accept.png”;
}
}

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

我猜您正在尝试在中更新UI

           file.Percentage = newPercentage;
           remainingBytes = s.Length - offset;
您必须将其包装在委托中,并在此基础上执行Dispatcher.BeginInvoke以从另一个线程更新您的UI:

Dispatcher.BeginInvoke(()=>{
    file.Percentage=newPercentage;
    remainingBytes = s.Length - offset;
});
通过这种方式,您可以向主线程上的messagequeue发送消息,主线程可以在有时间时执行委托