当前位置:编程学习 > C#/ASP.NET >>

问题无法定位,无比郁闷中,求高手指点!!

错误信息:
在 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 --------------------编程问答-------------------- 我也刚遇到了,正在解决中。。。 --------------------编程问答-------------------- 错误提示完全一样?也是数据库操作?
引用 4 楼 anguswdm 的回复:
我也刚遇到了,正在解决中。。。
--------------------编程问答-------------------- 错误提示一样,但是用途不一样,我是操作marshal的时候报错的。 --------------------编程问答-------------------- 别进行强制的垃圾回收。数据库中的连接是在连接池中,你close 时就是不占用,重新回到连接池。不能强制回收。 --------------------编程问答--------------------
引用 6 楼 anguswdm 的回复:
错误提示一样,但是用途不一样,我是操作marshal的时候报错的。

我之前没有强制回收,也是这样的,后来查网上有人说一段时间后自动回收造成内存压缩,图片资源地址改变,所以自己加了强制回收 --------------------编程问答--------------------
引用 7 楼 cuinan_6 的回复:
别进行强制的垃圾回收。数据库中的连接是在连接池中,你close 时就是不占用,重新回到连接池。不能强制回收。

我之前没有强制回收,也是这样的,后来查网上有人说一段时间后自动回收造成内存压缩,图片资源地址改变,所以自己加了强制回收 --------------------编程问答-------------------- 指针都出来了,学点c++知识也会害人啊。

使用正常的.net托管代码,先把产品做个可靠的版本出来吧。 --------------------编程问答-------------------- 仅仅在极小的范围内使用P/Invoke,此时在一两条语句内才会涉及指针,不要把那类代码扩大化。 --------------------编程问答-------------------- 请您指点,上述代码该如何修改呢?
引用 11 楼 sp1234 的回复:
仅仅在极小的范围内使用P/Invoke,此时在一两条语句内才会涉及指针,不要把那类代码扩大化。
--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,