尝试在Dispatcher中将图像设置为图像控件会产生错误

时间:2016-10-01 11:44:29

标签: c# wpf multithreading

以下是我的一些代码:

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,但它不起作用。

3 个答案:

答案 0 :(得分:0)

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

  

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

如果情况确实如此,因为BitmapImage本身就是DispatcherObject,所以关键在于您创建了哪个主题以及您想要哪个主题用它。您需要Freeze位图图像,因为它是在不同的线程上创建的

BitmapImage bi = new BitmapImage();
//...code for loading image

bi.Freeze();

Action updateImage = () => { this.picCover.Source = bi; };
Dispatcher.BeginInvoke(updateImage);

答案 1 :(得分:0)

我认为你可以这样做:

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

    this.picCover.Source = bi;
  });
}

答案 2 :(得分:0)

这样做:

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();