BitmapImage isDownloading 始终为真

BitmapImage isDownloading always true

我正在尝试加载 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();                
}

问题是,尽管根据 Fiddler 确实正在下载图像并在 0.4 秒内完成下载,但 DownloadCompleted 事件从未触发并且 isDownloading 属性 始终为真。

如有任何帮助,我们将不胜感激 谢谢!

由于您正在处理下载完成时引发的事件,因此您根本不应该 wait/block。

只需将下载完成后要执行的代码移动到事件处理程序并去掉 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();
}

在我看来像是一种竞争条件。在您进入 if (bitmapImage.IsDownloading) 块之后,但在您分配事件处理程序之前,图像下载已完成。因此,永远不会触发事件处理程序。

按以下方式重新排列您的陈述。

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

这应该确保下载文件时 DownloadCompleted 处理程序已经到位。