在对listBoxWell(ListBox)的删除中,由于RemoveAwellInfo从另一个线程调用,采用了invoke方法(具体见listBoxWellsRemove).问题是在语句: listBoxWells.Invoke(d, obj);  时出现NullReferenceException异常,已经确定obj和d是非空的.而且异常出现的不规则,调用几次才出现一次,有时2,3次,有时4,5次.
另外listBoxWell中对象全部是WellInfo.void RemoveAwellInfo(WellInfo wellInfo)
        {
            listBoxWellsRemove(wellInfo);
        }
    
delegate void listBoxWellsRemoveCallBack(Object obj);      private void listBoxWellsRemove(Object obj)
        {
            if (listBoxWells.InvokeRequired)
            {
                listBoxWellsRemoveCallBack d = new listBoxWellsRemoveCallBack(listBoxWellsRemove);
                listBoxWells.Invoke(d, obj);  //出现System.NullReferenceException异常!!
            }
            else
            {
                listBoxWells.Items.Remove(obj);
            }
        }

解决方案 »

  1.   

    知道原因了
    如果在调用删除之前选中listBoxWells里面的一项,则异常必然会出现!
    因为在listBoxWells_SelectedIndexChanged函数里有如下的语句:
    private void listBoxWells_SelectedIndexChanged(object sender, EventArgs e)
            {
                WellInfo wellInfo = (WellInfo)listBoxWells.SelectedItem;  //!!!
            }
    由于删除之后会触发此事件,所以会出现NullReferenceException.
    改进方法很简单,如下:
    private void listBoxWells_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (listBoxWells.SelectedItem == null)       
                    return;            WellInfo wellInfo = (WellInfo)listBoxWells.SelectedItem;
                //...
            }
    但还是不知为什么会异常在Invoke这句话出现,望高手指点~