Wpf中“由于其他线程拥有此对象,因此调用线程无法对其进行访问”
我的xaml中<Grid><UniformGridRows="2"Margin="0,0,0,40"><CanvasName="Image1"Margin="5"Back...
我的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"));就没有问题了?为什么?
}
哪里写的有问题? 展开
<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"));就没有问题了?为什么?
}
哪里写的有问题? 展开
3个回答
展开全部
这是因为bitmap控件是在你新开的线程里面创建的.而你委托后在主线程里面去调用他,就出错了.
如果是在主线程里面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);
}
如果是在主线程里面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属性设置为空,所以任何线程调他都不会出错.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询