尝试将图像设置为调度程序中的图像控件会产生错误

本文关键字:图像 控件 错误 调度程序 设置 | 更新日期: 2023-09-27 18:09:43

以下是我的一些代码:

var dispatcher = this.Dispatcher;
new Task(new Action(delegate
{
   BitmapImage bi = new BitmapImage();
   //...code for loading image
   Action updateImage = () => { this.picCover.Source = bi; };
   Dispatcher.BeginInvoke(updateImage);
})).Start();

picCover是一个图像小部件。这里Dispatcher.BeginInvoke(updateImage);我得到了一个System.InvalidOperationException:调用线程不能访问这个对象,因为不同的线程拥有它。我还试图将this.Dispatcher替换为picCover.Dispatcher,但它不起作用。

尝试将图像设置为调度程序中的图像控件会产生错误

你没有说错误是什么,但如果我没有错,那就是

必须在与DependencyObject相同的线程上创建DependencySource

如果是这样的话,那是因为BitmapImage本身就是DispatcherObject,所以在哪个线程上创建它以及在哪个线程上使用它都很重要。你需要Freeze位图图像,因为它是在不同的线程上创建的

BitmapImage bi = new BitmapImage();
//...code for loading image
bi.Freeze();
Action updateImage = () => { this.picCover.Source = bi; };
Dispatcher.BeginInvoke(updateImage);

我想你可以这样写:

async void Test()
{
  var dispatcher = this.Dispatcher;
  await dispatcher.InvokeAsync(() => {
    BitmapImage bi = new BitmapImage();
    //...code for loading image
    this.picCover.Source = bi;
  });
}

这样做:

var dispatcher = this.Dispatcher;
new Task(new Action(delegate
{
    Action updateImage = () => {
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.UriSource = new Uri("https://s-media-cache-ak0.pinimg.com/236x/c6/f2/7b/c6f27bf410ff72b91a7947ef5ee94f3d.jpg", UriKind.Absolute);
        bi.EndInit();
        this.picCover.Source = bi; 
    };
    Dispatcher.BeginInvoke(updateImage);
})).Start();