任务无法立即更新UI

时间:2019-02-13 19:35:48

标签: c# wpf asynchronous async-await task

我在CoverView(基于列表框创建)控件中添加了大量图片 信息太多时我有问题。添加的图像不会同时显示。我必须等到搜索并添加完成后才能知道加载图像需要花费时间。我还尝试通过减少像素来加快加载速度,但应用程序挂起
如何在不停止程序的情况下立即显示图像?
这是我的视图模型

public class ImageData
    {
        public string Name { get; set; }
        public ImageSource ImageSource { get; set; }
    }
public async Task LoadFolder(CancellationToken ct)
        {
            foreach (var path in Directory.EnumerateFiles(DataPath, "*.jpg"))
            {
                if (!ct.IsCancellationRequested)
                {

                    Images.Add(new ImageData
                    {
                        Name = path,
                        ImageSource = await LoadImage(path)
                    });
                }

            }
        }

public Task<BitmapImage> LoadImage(string path)
        {
            return Task.Run(() =>
            {
                var bitmap = new BitmapImage();

                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    bitmap.BeginInit();
                    bitmap.DecodePixelHeight = 100;
                    bitmap.CacheOption = BitmapCacheOption.OnLoad;
                    bitmap.StreamSource = stream;
                    bitmap.EndInit();
                    bitmap.Freeze();
                }

                return bitmap;
            });
        }

我这样称呼它

await ((ViewModel)DataContext).LoadFolder(ts.Token);

我也尝试过 IsAsync ,它的性能有所改善,但是程序继续挂起并起床很晚

<CoverView ItemsSource="{Binding Images, IsAsync=True}"/>

1 个答案:

答案 0 :(得分:0)

ImageData应该实现INotifyPropertyChanged并在ImageSource属性更改时通知,因为await稍后会为其提供值。 当绑定属性同步检索数据并使绑定时UI卡住时,IsAsync是相关的。 另外,图片应为ObservableCollection类型,因为await会延迟添加项目。