尝试将图像设置为调度程序中的图像控件会产生错误
本文关键字:图像 控件 错误 调度程序 设置 | 更新日期: 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();