以下是我的一些代码:
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
,但它不起作用。
答案 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();