Wpf中“由于其他线程拥有此对象,因此调用线程无法对其进行访问”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wpf中“由于其他线程拥有此对象,因此调用线程无法对其进行访问”相关的知识,希望对你有一定的参考价值。
我的xaml中
<Grid>
<UniformGrid Rows="2" Margin="0,0,0,40">
<Canvas Name="Image1" Margin="5" Background="#FFFFC0C0"></Canvas>
</UniformGrid>
<Button Content="Play" Width="40" Height="30" Name="play" VerticalAlignment="Bottom" Click="play_Click"></Button>
</Grid>
代码中写了很简单的一个线程
private void play_Click(object sender, RoutedEventArgs e)//按钮响应事件
Thread th = new Thread(refresh);
th.IsBackground = true;
th.Start();
void refresh()
while (true)
BitmapImage imagelist = new BitmapImage(new Uri("D:\\VS2010\\Project\\PreView\\PreView\\bin\\Debug\\1.jpg"));
Draw(imagelist);
public delegate void DrawHandler(BitmapImage bitmap);
void Draw(BitmapImage bitmap)
App.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new DrawHandler(ActualDraw), bitmap);
void ActualDraw(BitmapImage bitmap)
Image1.Background = new ImageBrush(bitmap);
//如果将这里换成Image1.Background = new BitmapImage(new Uri("D:\\VS2010\\Project\\PreView\\PreView\\bin\\Debug\\1.jpg"));就没有问题了?为什么?
哪里写的有问题?
如果是在主线程里面New 一个图片的话是可以的.
BitmapImage imagelist = new BitmapImage(new Uri(@"D:\\VS2010\\Project\\PreView\\PreView\\bin\\Debug\\1.jpg"));
void ActualDraw(BitmapImage bitmap)
Image1.Background = new ImageBrush(imagelist);
追问
我已经找到原因了
是BitmapImage资源无法释放的问题
在while (true)
imagelist.Freeze();//new后面加上这句就OK
Draw(imagelist);
imagelist.Freeze();
此方法不是释放资源,而是冻结依赖项属性.
这个方法将imagelist的内部的Dispatcher属性设置为空,所以任何线程调他都不会出错.
哦 这样 谢谢
参考技术A bitmap资源之前被调用过,没有释放,所以再调用时无法访问。 参考技术B 应该是你在在线程创建了控件,却在一个新的线程中调用它了。这是多线程中常见问题
wpf窗口中的资源的混合使用---WPF
WPF可以在窗体内定义resources,其中可以写一些模板什么的。也可以在里面直接引用其他资源字典文件。就像下面这样。
<ResourceDictionary > <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source= "/MEFA.Procedure.WatchProcedure;component/LocalControls/SelectPerson.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
但是有时候,我们想两种方式混合使用。会出现一个错误,就是”resources只能被定义一次“。。。这个时候,一般是写法出错了。应该这样写
以上是关于Wpf中“由于其他线程拥有此对象,因此调用线程无法对其进行访问”的主要内容,如果未能解决你的问题,请参考以下文章