我正在编写一个类,它可以从本地文件或Web链接异步加载BitmapImage。我使用DownloadCompleted和DownloadFailed事件等待BitmapImage结束下载,然后冻结它并将其从工作线程传递到UI线程。但是我的代码不起作用,如果我将Web链接设置为BitmapImage的UriSource,这些事件处理程序将永远不会被调用。然而,我注意到WPF Image控件可以在其源代码(BitmapImage)完全下载并显示它时得到通知,所以我猜一定有一些我不知道的方式来获得通知时,BitmapImage完成加载。有人知道吗?下面是我的代码:
BitmapImage image = await Task.Run(async () =>
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = uri;
image.EndInit();
if (image.IsDownloading)
{
using EventWaitHandle handle = new EventWaitHandle(
false, EventResetMode.ManualReset);
void RemoveEventHandler()
{
image.DownloadCompleted -= OnDownloadCompleted;
image.DownloadFailed -= OnDownloadFailed;
}
void OnDownloadCompleted(object? sender, EventArgs args)
{
handle.Set();
RemoveEventHandler();
}
void OnDownloadFailed(object? sender, EventArgs args)
{
handle.Set();
RemoveEventHandler();
}
image.DownloadCompleted += OnDownloadCompleted;
image.DownloadFailed += OnDownloadFailed;
await Task.Run(handle.WaitOne);
}
image.Freeze();
return image;
});
2条答案
按热度按时间eqqqjvef1#
您应该在设置
UriSource
和下载开始之前连接事件处理程序。这对我很有效:sqougxex2#
看起来
DownloadCompleted
和DownloadFailed
事件是are not fired in a background thread,因此您不能轻松地将代码 Package 在Task.Run
调用中。除此之外,您可以在这样的方法中使用
TaskCompletionSource
,而不是等待EventWaitHandle
:但是,您可以手动下载图像,如下所示: