关于多线程访问Bitmap引起对象当前正在其他地方使用的错误提问


        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即用即放。