Thread t1;
Thread t2;
int count1 = 0;
int count2 = 0;
static readonly object olock = new object();
public Bitmap bitmapVal = new Bitmap(@"C:\Users\BEIYUTECH\Desktop\th.jpg");
public Bitmap BitmapVal
{
get
{
lock (olock)
{
return (Bitmap)bitmapVal.Clone();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
t1 = new Thread(getBitmap1);
t1.Start();
t2 = new Thread(getBitmap2);
t2.Start();
}
private void getBitmap1()
{
while (true)
{
count1++;
this.pictureBox1.Image = this.BitmapVal;
}
}
private void getBitmap2()
{
while (true)
{
count2++;
this.pictureBox2.Image = this.BitmapVal;
}
}
出错代码行:this.pictureBox1.Image = this.BitmapVal;或者this.pictureBox2.Image = this.BitmapVal;
错误信息:
“System.InvalidOperationException”类型的未经处理的异常在 System.Drawing.dll 中发生
其他信息: 对象当前正在其他地方使用。
已经使用了lock为什么没有效果,还是说我用发错了或者其他原因。请各位大大不吝赐教!谢谢~
对象指的是pictureBox1.Image这个对象,不是BitmapVal
两个pictureBox是可以将Image指定为同一个Bitmap的
-=-=-=
问题的关键不在于对象,而在于你在子线程里操作UI对象
想在子线程里操作UI对象,你需要使用委托。
问题应该不在lock中的代码,应该是这个
public Bitmap bitmapVal = new Bitmap(@"C:\Users\BEIYUTECH\Desktop\th.jpg");
微软官方解释:Bitmap在生命周期内,被打开的文件保持锁定状态,直到位图被释放。所以当多次打开此文件时就会报此错误。
解决方法,对Bitmap即用即放。