BitmapImage isDownloading всегда true - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь загрузить bitmapImage, ожидая загрузки до 10 секунд. Для этого мне нужно определить, когда изображение закончило загрузку. Поэтому я проверяю свойство isDownloading, чтобы определить, действительно ли загружается изображение.

Вот код:

Uri imageUri = new Uri(imageSource);
BitmapImage bitmapImage = new BitmapImage(imageUri);
if (bitmapImage.IsDownloading)
{
   bitmapImage.DownloadCompleted += (s, e) => _autoResetEvent.Set();
   var imageLoadingTimer = new Timer(10000);
   imageLoadingTimer.Elapsed += (s, e) => _autoResetEvent.Set();
   imageLoadingTimer.Start();
   _autoResetEvent.WaitOne();                
}

Проблема в том, что изображение действительно загрузка и завершение загрузки в течение 0,4 секунд, согласно Fiddler, событие DownloadCompleted никогда не запускается, а свойство isDownloading всегда имеет значение true.

Любая помощь будет высоко оценена Спасибо!

Ответы [ 2 ]

1 голос
/ 16 марта 2020

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

Просто переместите код, который вы хотите выполнить после завершения загрузки, в обработчик событий и избавьтесь от AutoResetEvent:

string imageSource = "";
Uri imageUri = new Uri(imageSource);
BitmapImage bitmapImage = new BitmapImage(imageUri);
if (bitmapImage.IsDownloading)
{
    void OnCompleted()
    {
        //...
    }

    bitmapImage.DownloadCompleted += (s, e) => OnCompleted();
    var imageLoadingTimer = new Timer(10000);
    imageLoadingTimer.Elapsed += (s, e) => OnCompleted();
    imageLoadingTimer.Start();
}
0 голосов
/ 16 марта 2020

Выглядит как состояние гонки для меня. Загрузка изображения завершена после ввода блока if (bitmapImage.IsDownloading), но до назначения обработчика события. В результате обработчик событий никогда не запускается.

Переупорядочивайте свои операторы следующим образом.

var bitmapImage = new BitmapImage();
bitmapImage.DownloadCompleted += (s, e) => ... // Whatever
bitmapImage.UriSource = imageUri;

Это должно гарантировать, что обработчик DownloadCompleted уже существует к тому времени, когда файл загружен.

...