C#中PictureBox加载GIF图片时,对象当前正在其他地方使用,占用、内存溢出、加载异常处理

困扰我好长一段时间的问题,在使用picturebox控件加载图片时,报错:对象当前正在其他地方使用。然后Picturebox控件显示好大一把‘ 红叉 ×’ ,原本的代码使用的

Image.FromFile(filepath); 

这种方式调用,又因为线程比较多,界面来回切换,图片频繁切换,加载个几次就挂了 ,后面我重写了一个:调用Resoure资源存图,再调用;第一步需要将图片添加到项目的Resoure资源(不会的百度),第二步,调用。

代码如下:

        /// <summary>
        /// 0607 xl Resource方式添加gif图
        /// </summary>
        /// <param name="nFlowType"></param>
        /// <param name="arrStepNo"></param>
        /// <param name="image1"></param>
        /// <param name="image2"></param>
        private static void GetImage2(int nFlowType, ArrayList arrStepNo, out Image image1, out Image image2)
        {
            image1 = lastImage1;
            image2 = lastImage2;
            string _项目名 = string.Empty;
            switch (nFlowType)
            {
                case 1:
                    _项目名 = "分离";
                    break;
                case 2:
                    _项目名 = "磁分选";
                    break;
                case 3:
                    _项目名 = "培养箱";
                    break;
                case 4:
                    _项目名 = "去磁";//取消
                    break;
                case 5:
                    _项目名 = "制剂";
                    break;
                default:
                    break;
            }
            string imageName = _项目名 + "_" + arrStepNo[0].ToString();
            string imageName2 = string.Empty;
            if (arrStepNo.Count == 2)
            {
                imageName2 = _项目名 + "_" + arrStepNo[1].ToString().Replace("--", "_");
            }
            Assembly myAssem = Assembly.GetExecutingAssembly();
            ResourceManager resourceManager = new ResourceManager("SmartSystemUI.Resource_Gif", myAssem);
            Object obj = resourceManager.GetObject(imageName);//获取Resource里面的图片资源
            //Bitmap img1 = (Bitmap)obj;
            image1 = (Bitmap)obj;
            //image1 = img1;
            if (imageName2 != "")
            {
                Object obj2 = resourceManager.GetObject(imageName2);
                //Bitmap img2 = (Bitmap)obj2;
                image2 = image1;
                image1 = (Bitmap)obj2;
            }
        }

因为有时候需要调用两个Gif图叠加,所以我上面写的调用两个图片资源,获取到资源以后,将其放到picturebox控件里,代码如下:

        /// <summary>
        /// 获取PID流程图片
        /// </summary>
        /// <param name="nFlowType">流程类型 </param>
        /// <param name="arrStepNo">流程编号 0-大图编号 1-小图编号</param>
        /// <param name="pb">需要显示的图片控件</param>
        public static void GetPIDWorkflowImage(int nFlowType, ArrayList arrStepNo, PictureBox pb)
        {
            lock (objLock)
            {
                try
                {
                    GC.Collect();//0725新增回收
                    if (pb.Image != null)
                    {
                        pb.Image.Dispose();
                    }//0802 图片原本资源释放
                    //pb.Refresh();
                    pb.Controls.Clear();


                    //GetImage(nFlowType, arrStepNo, out image1, out image2);//0519
                    GetImage2(nFlowType, arrStepNo, out image1, out image2);

                    pb.Image = image1;
                    if (image2 != null)
                    {
                        Image img = image2;
                        PictureBox pic = new PictureBox();
                        pic.BackColor = Color.Transparent;
                        pic.Image = img;
                        pic.Width = img.Width - 10;
                        pic.Height = img.Height;
                        pb.Controls.Add(pic);
                    }


                }
                catch (Exception ex)
                {
                    ReadWriteTxt.WriteFileLog.WriteLog("PID图片加载异常:" + ex.ToString());//异常时存日志
                    //pb.Dispose();
                    pb.Refresh();
                }
                finally
                {
                    GC.Collect();
                }
            }
        }

里面使用到了几个关键工具,

a.pb.Image.Dispose();

b.pb.Controls.Clear();

c.GC.Collect();

d.lock(){}

e.pb.Refresh();

具体效果自测,反正我的图片加载起来基本上稳定了

 以上是我的调用

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xieBug的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值