none
C#程序ListBox相关的崩溃问题 RRS feed

  • 问题

  • VS2012写的,Windows日志中的程序异常信息如下:

                             
    //--------------------------------------------------异常信息----------------------------------------------------//

    日志名称:          Application
    来源:            .NET Runtime
    日期:            2017/8/16 17:45:06
    事件 ID:         1026
    任务类别:          无
    级别:            错误
    关键字:           经典
    用户:            暂缺
    计算机:           CMP1-PC
    描述:
    应用程序: CMP.exe
    Framework 版本: v4.0.30319
    说明: 由于未经处理的异常,进程终止。

    异常信息: System.NullReferenceException
    堆栈:

    在 System.Windows.Forms.ListBox+ItemArray.GetItem(Int32, Int32)

    在 System.Windows.Forms.ListBox+ObjectCollection.RemoveAt(Int32)

    在 CMP.EPD.UpdateEPDCommMessage(System.String)

    在 CMP.EPD.AddEPDCommMessage(System.String)

    在 CMP.EPD.Client_OnRead(System.Net.Sockets.Socket, System.String)

    在 CMP.EPD_client.OnDataReceived(System.IAsyncResult)

    在 System.Net.LazyAsyncResult.Complete(IntPtr)

    在 System.Net.ContextAwareResult.CompleteCallback(System.Object)

    在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

    在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

    在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

    在 System.Net.ContextAwareResult.Complete(IntPtr)

    在 System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)

    在 System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

    在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

    事件 Xml:
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name=".NET Runtime" />
        <EventID Qualifiers="0">1026</EventID>
        <Level>2</Level>
        <Task>0</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2017-08-16T09:45:06.000000000Z" />
        <EventRecordID>27800</EventRecordID>
        <Channel>Application</Channel>
        <Computer>CMP1-PC</Computer>
        <Security />
      </System>
      <EventData>
        <Data>
    应用程序: CMP.exe
    Framework 版本: v4.0.30319
    说明: 由于未经处理的异常,进程终止。
    异常信息: System.NullReferenceException
    堆栈:

    在 System.Windows.Forms.ListBox+ItemArray.GetItem(Int32, Int32)

    在 System.Windows.Forms.ListBox+ObjectCollection.RemoveAt(Int32)

    在 CMP.EPD.UpdateEPDCommMessage(System.String)

    在 CMP.EPD.AddEPDCommMessage(System.String)

    在 CMP.EPD.Client_OnRead(System.Net.Sockets.Socket, System.String)

    在 CMP.EPD_client.OnDataReceived(System.IAsyncResult)

    在 System.Net.LazyAsyncResult.Complete(IntPtr)

    在 System.Net.ContextAwareResult.CompleteCallback(System.Object)

    在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

    在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

    在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

    在 System.Net.ContextAwareResult.Complete(IntPtr)
       在 System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)

    在 System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

    在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

        </Data>
      </EventData>
    </Event>

    //--------------------------------------------------异常信息----------------------------------------------------//

    相关代码段如下,就是超过两百条之后移除第一条,根据高度计算显示最新的Listbox条目。

    private void UpdateEPDCommMessage(string msg)       
     {           
            while (lbx_EPD_Comm.Items.Count > 200)  
            {
                    lbx_EPD_Comm.Items.RemoveAt(0);  
            }                          
            lbx_EPD_Comm.Items.Add(msg);           
            if (lbx_EPD_Comm.Items.Count >= (lbx_EPD_Comm.Height / lbx_EPD_Comm.ItemHeight))           
            {               
                    lbx_EPD_Comm.TopIndex = lbx_EPD_Comm.Items.Count - (int)(lbx_EPD_Comm.Height /  lbx_EPD_Comm.ItemHeight) + 1;           
            }       
     }

    请大家给看看,是哪出的问题。谢谢

    2017年8月21日 2:52

全部回复

  • System.NullReferenceException 空引用

    看代码,应该是来源于这一句

     lbx_EPD_Comm.Items.RemoveAt(0);  

    导致的空异常

    在 System.Windows.Forms.ListBox+ItemArray.GetItem(Int32, Int32)

    在 System.Windows.Forms.ListBox+ObjectCollection.RemoveAt(Int32)

    没看出代码方面的问题,可否将断点放置于此处,调试下,看下lbx_EPD_Comm和它的Items.Count属性


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年8月22日 0:37
  • Hi,

    感谢你在MSDN论坛发帖。

    根据这一小段代码,很难定位问题的所在,根据这个exception, 是你引用一个null的object导致的结果。我建议代码中有返回值的,都进行一次判断,查看其返回值是不是null.

    或者采用Shuanghua Li 的方法,设置断点调试一下。

    为了更好的解决问题,我建议你上传一份可以重现问题的代码到one drive 上面。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月22日 6:24
    版主