困扰我好长一段时间的问题,在使用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();
具体效果自测,反正我的图片加载起来基本上稳定了
以上是我的调用