问题无法定位,无比郁闷中,求高手指点!!
错误信息:在 System.AccessViolationException 中第一次偶然出现的“未知模块”类型的异常
“FaceRecognition.vshost.exe”(托管): 已加载“C:\WINDOWS\assembly\GAC_MSIL\System.Transactions.resources\2.0.0.0_zh-
CHS_b77a5c561934e089\System.Transactions.resources.dll”,未加载符号。
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord"
Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exce
ption/Unhandled</TraceIdentifier><Description>未处理的异常
</Description><AppDomain>FaceRecognition.vshost.exe</AppDomain><Exception><ExceptionType>System.AccessViolationException,
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>尝试读取或写入受保护
的内存。这通常指示其他内存已损坏。</Message><StackTrace>
</StackTrace><ExceptionString>System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
</ExceptionString></Exception></TraceRecord>
未处理的“System.AccessViolationException”类型的异常出现在 未知模块 中。
其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
以下两段代码1.查询数据库,将结果显示在listView中;2.单击某一条记录时查询并显示对应图片信息
上两步操作后不立即报错,过一段时间,有时报错,有时不报错,居然是随机。。。
代码如下:
--------------------编程问答--------------------
private void button1_Click(object sender, EventArgs e)
{
//查询数据库,将结果显示在listView中
button1.Enabled = false;
//button4.Enabled = false;
button1.Text = "查询中...";
tblFrData fr = new tblFrData();
try
{
listView1.Items.Clear();
if (dtResultwhite != null && dtResultwhite.Tables.Count > 0)
dtResultwhite = null;
dtResultwhite = fr.GetListQuery(name,IDCard,location, start, end,time, "识别监控记录");
dtResultwhite.Tables[0].AcceptChanges();
}
catch (Exception ex)
{
MessageBox.Show("查询失败!");
MainForm.WriteLog(ex.Message.ToString());
throw ex;
fr = null;
button1.Enabled = true;
button1.Text = "查询记录";
return;
}
int intMod;
intTotalCount = dtResultwhite.Tables[0].Rows.Count;
if (intTotalCount == 0)
{
this.listView1.Refresh();
this.listView1.ResetText();
this.listView1.Items.Clear();
MessageBox.Show("白名单识别记录数据库中没有数据!");
}
else
{
for (int i = 0; i < intTotalCount; i++)
{
ListViewItem items = new ListViewItem(i.ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cLocation"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cType"].ToString());
//items.SubItems.Add("识别通过");
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cName"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cDate"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cTime"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cTemID"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cSimilar"].ToString());
items.SubItems.Add(dtResultwhite.Tables[0].Rows[i]["cID"].ToString());
this.listView1.Items.Add(items);
}
}
button1.Enabled = true;
button1.Text = "查询记录";
label6.Text = intTotalCount.ToString() + "条";
GC.Collect();
}
public unsafe void listView1_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
//单击时查询并显示对应图片信息
tblFrData fr = new tblFrData();
DataSet dt = null;
if (((ListView)sender).SelectedItems.Count > 0)
{
//tblFrData frData = new tblFrData();
////读数据库
try
{
if (((ListView)sender).SelectedItems[0].SubItems[8].Text != "")
{
dt = fr.GetList("cID =" + "'" + ((ListView)sender).SelectedItems[0].SubItems[8].Text + "'", 4);
}
else
{
MessageBox.Show("数据库中没有匹配项!");
}
if (dt.Tables[0].Rows.Count > 0)
{
lock(this)
{
//Marshal.Copy((byte[])dt.Tables[0].Rows[0]["cPic"], 0, pic, ((byte[])dt.Tables[0].Rows[0]
["cPic"]).Length);
fixed (byte* numRefs = (byte[])dt.Tables[0].Rows[0]["cPic"])
{
IntPtr pic = new IntPtr((void*)numRefs);
Bitmap newpic1 = new Bitmap(200, 148, 200 * 3,
System.Drawing.Imaging.PixelFormat.Format24bppRgb, pic);
IntPtr picture = newpic1.GetHbitmap();
this.pictureBox1.Image = Image.FromHbitmap(picture);
DeleteObject(picture);
picture = IntPtr.Zero;
newpic1.Dispose();
newpic1 = null;
DeleteObject(pic);
//Marshal.FreeCoTaskMem(pic);
}
}
}
else
{
MessageBox.Show("数据库中没有匹配项!");
}
}
catch (System.Exception ex)
{
MainForm.WriteLog(ex.ToString()+"-"+"查询图片错误!");
}
}
dt.Dispose();
dt = null;
GC.Collect();
}
不知道~! --------------------编程问答-------------------- 最好不使用不安全代码和非托管的代码 不然有些错误很奇怪 用时间委托可以代替指针! --------------------编程问答-------------------- wa!好晕o --------------------编程问答-------------------- 我也刚遇到了,正在解决中。。。 --------------------编程问答-------------------- 错误提示完全一样?也是数据库操作?
--------------------编程问答-------------------- 错误提示一样,但是用途不一样,我是操作marshal的时候报错的。 --------------------编程问答-------------------- 别进行强制的垃圾回收。数据库中的连接是在连接池中,你close 时就是不占用,重新回到连接池。不能强制回收。 --------------------编程问答--------------------
我之前没有强制回收,也是这样的,后来查网上有人说一段时间后自动回收造成内存压缩,图片资源地址改变,所以自己加了强制回收 --------------------编程问答--------------------
我之前没有强制回收,也是这样的,后来查网上有人说一段时间后自动回收造成内存压缩,图片资源地址改变,所以自己加了强制回收 --------------------编程问答-------------------- 指针都出来了,学点c++知识也会害人啊。
使用正常的.net托管代码,先把产品做个可靠的版本出来吧。 --------------------编程问答-------------------- 仅仅在极小的范围内使用P/Invoke,此时在一两条语句内才会涉及指针,不要把那类代码扩大化。 --------------------编程问答-------------------- 请您指点,上述代码该如何修改呢?
--------------------编程问答--------------------
补充:.NET技术 , C#