Silverlight, Обновление интерфейса во время обработки - PullRequest
0 голосов
/ 13 ноября 2009

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

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
                offset += BUFFERSIZE;
                int newPercentage = offset / (int)file.FileInfo.Length * 100;
                file.Percentage = newPercentage;
                remainingBytes = s.Length - offset;
                System.Threading.Thread.Sleep(10);
            }
            file.Percentage = 100;
            file.ImageSource = "accept.png";
        }
    }

UploadFile привязан к пользовательскому интерфейсу, поэтому изменения в этом файле будут отражены в пользовательском интерфейсе. Проблема заключается в том, что вся эта загрузка занимает слишком много времени (имитируется это во сне), и во время этого пользовательского интерфейса связи не обновляется, любая идея о том, как это сделать?

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Что вам нужно сделать, это запустить этот метод в новом потоке (т.е. не в потоке пользовательского интерфейса). Если вы блокируете поток пользовательского интерфейса (например, в спящем режиме), то он блокируется каким-либо образом для обновления или ответа пользователю.

Если вам нужно что-то изменить в пользовательском интерфейсе, он должен иметь из потока пользовательского интерфейса. Поэтому, если вам нужно изменить пользовательский интерфейс, а ваш код выполняется в другом потоке, вы можете использовать метод Dispatcher.BeginInvoke для отправки операции в поток пользовательского интерфейса. Вы можете получить доступ к объекту Dispatcher приложения через: Deployment.Current.Dispatcher.

0 голосов
/ 13 ноября 2009

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

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