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 处理程序已经到位。
我正在尝试加载 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 处理程序已经到位。