使用任务并行库下载BitmapImage

时间:2011-03-29 08:46:46

标签: wpf task task-parallel-library bitmapimage

从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创建流,然后从该流中加载位图并在返回之前将其冻结。 这应该创造一个我相信真正膨胀的代码。

有没有办法在尝试从网络上显示图像时保持代码小(呃)和(更多)可读?

1 个答案:

答案 0 :(得分:2)

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

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

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