Обновление интерфейса кросс-нити Silverlight - PullRequest
3 голосов
/ 14 ноября 2009

У меня есть этот класс:

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));
        }
    }
}

Я пытаюсь создать загрузку файлов, способную загружать как большие, так и несколько файлов. Я делаю это с помощью веб-службы. Я сделал двустороннюю привязку в своем интерфейсе, и теперь я хочу загрузить файлы. Я делаю это, используя этот код

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";
        }
    }

Проблема в том, что я не могу обновить интерфейс или операцию с несколькими потоками. Я пытался использовать Dispatcher, но мне это не удалось, потому что я не знал, куда его вставить.

1 Ответ

5 голосов
/ 14 ноября 2009

Полагаю, вы пытаетесь обновить свой пользовательский интерфейс в

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

Вам нужно будет обернуть это в делегате и выполнить Dispatcher.BeginInvoke, чтобы обновить пользовательский интерфейс из другого потока:

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

Таким образом, вы отправляете сообщение в очередь сообщений в основном потоке, и основной поток может выполнить делегат, когда у него есть время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...