1

从 UI 线程上的 URI 下载 BitmapImage 会挂起应用程序。为避免这种情况,我尝试在单独的线程中下载 BitmapImage,想知道是否可以使用 TPL 使其变得简单。

我目前的方法如下:

            Task.Factory.StartNew<BitmapImage>(() => new BitmapImage(myUri) { CacheOption = BitmapCacheOption.OnLoad }, CancellationToken.None, TaskCreationOptions.None, new StaTaskScheduler(1))
        .ContinueWith(t => image1.Source = t.Result, TaskScheduler.FromCurrentSynchronizationContext());

这个问题当然是事实,BitmapImage 不是在与 Image 相同的线程上创建的。

从 URI 加载的 BitmapImage 不能被冻结,因此无法正常工作。

目前,我能想到的最简单的方法是从 URI 创建一个流,然后从该流加载位图并在返回之前将其冻结。我相信这应该会创建一个非常臃肿的代码。

在尝试显示来自网络的图像时,有没有办法让代码更小(更好)和(更多)可读?

4

1 回答 1

2

如果图像位于 XAML 文件中并且您正在使用绑定来加载它,请将其设置IsAsync为 true 以异步下载它。

当然,最好在图像显示之前提供一个备用占位符。一种方法是使用PriorityBinding.

如果您必须以编程方式执行此操作,请尝试创建一个异步 ImageSource,然后将 BitmapImage 的源设置为它。

于 2011-03-29T11:11:28.313 回答