各位好!小弟请教如下问题!!
有一个ArrayList里面存的都是 byte型的数据,现连续对他做增加(Add())和删除(RemoveAt())操作,当操作频率不高的时候没有异常,当频率提高的时候ArrayList中出现了null值,请问为何?

解决方案 »

  1.   

    you can use Remove() 
     not RemoveAt()
      

  2.   

    to  y547270620 删除时删第一个的!
      

  3.   

    to:q107770540  我现在是每次删第一个元素~~~
      

  4.   

    to:y547270620
    方法冒长来。结构是这样的。
    (1)在Serialport的DataReceived事件里将接收到的数据一个个用Add方法加入到ArrayList中
    (2)此时,另外有个线程,while循环一直在检测ArrayList中是否有数据,若有,每次取出第一个数据,然后将取出的数据用RemoveAt()移除。就是这样。ps:当串口接收数据不快的时候不会出错,当接收数据很快的时候,就在ArrayList中出现了null值!!
      

  5.   

    to:q107770540 RemoveAt()和Remove()有什么本质区别??
      

  6.   

    一个根据索引,一个根据Key 删除
      

  7.   

     好像不是这样的 你是两条线程在操作 一个线程 往里面填数据  一个线程看, 有种情况就是 看数据这条线程 在读 arraylist时 那个添加线程 的数据还没进去 ,所以就是空值 这就是cup 运行的时间隔 有关系 ,我原来在用线程的时 也遇到一个问题 就两条线程 感觉1条运行 比 2条快些
      

  8.   

    不好意思,昨天有点事后来下了!!!
    好像也不是这样,另一个线程查看arraylist数据的时候是先判断过的,只有当arraylist.count>0时才会执行。
      

  9.   


    考虑下这种情况,arraylist中只有一个元素,然后线程A B先后执行了判断代码arraylist.count>0并且都通过了判断,然后A B先后执行删除操作,会发生什么。。
      

  10.   

    建议用 List<byte> 泛型
      

  11.   

    C# SerialPort类中的DataReceived事件,本来带缓冲链表的,不用自己实现,只需一个个字符取出来就行了。
    比如:
        void COM_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
          while(BytesToRead > 0)
          {
            byte [] buf = new byte[1];
            Read(buf, 0, 1);
            处理字符的方法(buf[0]);//这里加处理方法就行了
          }
        }
      

  12.   

    弄个timer 放updatepanel里 在Timer_Tick事件里写你要的东西
      

  13.   

    呵呵。我倒是奇怪了,怎么搞出timer来了~~
      

  14.   

    当频率过高时有可能你的RemoveAt次数大于Add次数, 仔细检查一下代码
      

  15.   

    调用Synchronized()方法 ,获取一个包装过的同步版本。
      

  16.   

    做个限制吧,在小于arraylist大小范围内删除试试!
      

  17.   

    可以通过arraylist的迭代器对list进行删除或add,这样会安全一些,不然的话可能会出现混乱 相对而言
      

  18.   

    感谢各位的关注!!!!结贴了,主要原因也就是因为ArrayList是非线程安全的吧,两个线程同时操作导致了数据的不一致性。
    谢谢!!!!!!!!!!!!