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

void btnTotalSizes_Click(object sender, RoutedEventArgs e)
{
    // ...
    UriBuilder ub = new UriBuilder("http://localhost:21636/FileReceiver.ashx");
    WebClient wc = new WebClient();
    wc.OpenWriteCompleted += (s2, e2) =>
    {
        PushData(outStream, e2.Result);
        e2.Result.Close();
        outStream.Close();
    };
    wc.OpenWriteAsync(ub.Uri);
}

private static void PushData(Stream input, Stream output)
{
    byte[] buffer = new byte[4096];
    int bytesRead = 0;
    int tempTotal = 0;

    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
    {
        output.Write(buffer, 0, bytesRead);
        tempTotal += bytesRead;
        _uploadProg++;
        int percentDone = (int)(
            ((decimal)tempTotal / (decimal)input.Length) * 100);
        ProgressUpdated(null, new UploadProgressChangedEventArgs(percentDone));
    } 
}

void MainPage_ProgressUpdated(object sender, UploadProgressChangedEventArgs e)
{
    progFileProg.Maximum = 100;
    progFileProg.Value = e.ProgressPercentage;
    sbUpdateProg.Begin();
} 
1
Paul Johnson 9 Янв 2010 в 03:02
Вам не нужно звонить Dispatcher.BeginInvoke()?
 – 
Rubens Farias
9 Янв 2010 в 03:13

2 ответа

Вам нужно обработать событие WebClient.UploadProgressChanged.

Обработчик событий должен периодически обновляться. В обработчике обновите свой пользовательский интерфейс.

1
Michael S. Scherotter 9 Янв 2010 в 03:29
Привет, спасибо за ответ. Я попробовал событие UploadProgressChanged, но, похоже, оно никогда не сработает, даже если я поместил Thread.Sleep(10) в цикл up PushData. Если предположить, что это событие, вероятно, было только для случая, когда вы использовали UploadStringAsync().
 – 
Paul Johnson
9 Янв 2010 в 11:20

Мне удалось запустить его сейчас. Я использовал Dispatcher.BeginInvoke(), как прокомментировал Рубенс Фариас. Также мне пришлось добавить цикл загрузки в новый поток. Я предполагал, что до того, как асинхронный обратный вызов будет в новом потоке, но я думаю, что нет.

public static event EventHandler UploadCompleted;
        public static event ProgressChangedEvent ProgressUpdated;

        public static int _fileLength;
        public static int _uploadProg;


        private List<FileInfo> _allSelectedFiles = new List<FileInfo>();


        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);

            btnAnimate.Click += new RoutedEventHandler(btnAnimate_Click);
            btnTotalSizes.Click += new RoutedEventHandler(btnTotalSizes_Click);
            ProgressUpdated += new ProgressChangedEvent(MainPage_ProgressUpdated);
        }

        void MainPage_ProgressUpdated(object sender, UploadProgressChangedEventArgs e)
        {
            Dispatcher.BeginInvoke(() =>
            {
                progFileProg.Maximum = 100;
                progFileProg.Value = _uploadProg;
                sbUpdateProg.Begin();
            });
        }


        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
        }

        void btnTotalSizes_Click(object sender, RoutedEventArgs e)
        {
            foreach (FileInfo fi in _allSelectedFiles)
            {
                Stream fileStream = fi.OpenRead();


                //DecodedJpeg jpegIn = new JpegDecoder(fileStream).Decode();
                //DecodedJpeg jpegOut = new DecodedJpeg(
                //    new ImageResizer(jpegIn.Image)
                //        .Resize(1500, ResamplingFilters.NearestNeighbor),
                //    jpegIn.MetaHeaders); // Retain EXIF details
                //MemoryStream outStream = new MemoryStream();
                //new JpegEncoder(jpegOut, 90, outStream).Encode();

                //outStream.Seek(0, SeekOrigin.Begin);
                //outStream.Position = 0;
                //UploadFile(fi.Name, outStream, "resources");

                UriBuilder ub = new UriBuilder("http://localhost:21636/FileReceiver.ashx");
                WebClient wc = new WebClient();

                //wc.UploadProgressChanged += (s2, e2) =>
                //{
                //    ProgressUpdated(null, new UploadProgressChangedEventArgs(_uploadProg));
                //};



                wc.OpenWriteCompleted += (s2, e2) =>
                {
                    System.Threading.Thread thr = new Thread(delegate()
                    {
                        PushData(fileStream, e2.Result);
                        e2.Result.Close();
                        fileStream.Close();
                    });
                    thr.Start();
                };
                wc.OpenWriteAsync(ub.Uri);

            }
        }





        private static void PushData(Stream input, Stream output)
        {
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            int tempTotal = 0;



            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
            {
                output.Write(buffer, 0, bytesRead);
                tempTotal += bytesRead;
                _uploadProg++;
                int percentDone = (int)(((decimal)tempTotal / (decimal)input.Length) * 100);
                _uploadProg = percentDone;
                ProgressUpdated(null, new UploadProgressChangedEventArgs(percentDone));

                Thread.Sleep(50);
            } 
        }
0
Paul Johnson 9 Янв 2010 в 15:47