【问题标题】:BitmapImage isDownloading always trueBitmapImage isDownloading 始终为真
【发布时间】:2020-03-16 22:12:40
【问题描述】:

我正在尝试加载位图图像,同时等待它加载长达 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 属性始终为 true。

任何帮助将不胜感激 谢谢!

【问题讨论】:

  • 在 fiddler 中如何下载图像?是 TCP 还是 HTTP?提琴手是否显示任何标题或连接关闭?图像是 base 64 流还是 GZIP? TCP 你无法判断接收到的二进制消息是否完成,除非在消息的开头给出字节数的连接关闭。
  • DownloadCompleted 事件在 UI 线程中执行,被 WaitOne 调用阻塞。
  • @jdweng 谢谢,提琴手打开一个 https 连接并下载整个图像 - 我可以在响应中看到,在 imageview 选项卡下,我试图下载的图片。我不确定你问的其他问题,你建议我接下来检查什么?
  • 如果您使用的是阻塞的 http 响应,那么当响应返回时,您将获得整个消息。如果响应在 0.4 秒内返回,则不需要任何异步方法。

标签: c# wpf bitmapimage


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2012-11-23
      • 2015-12-05
      相关资源
      最近更新 更多