关于c# ArrayList的问题 各位好!小弟请教如下问题!!有一个ArrayList里面存的都是 byte型的数据,现连续对他做增加(Add())和删除(RemoveAt())操作,当操作频率不高的时候没有异常,当频率提高的时候ArrayList中出现了null值,请问为何? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 you can use Remove() not RemoveAt() to y547270620 删除时删第一个的! to:q107770540 我现在是每次删第一个元素~~~ to:y547270620方法冒长来。结构是这样的。(1)在Serialport的DataReceived事件里将接收到的数据一个个用Add方法加入到ArrayList中(2)此时,另外有个线程,while循环一直在检测ArrayList中是否有数据,若有,每次取出第一个数据,然后将取出的数据用RemoveAt()移除。就是这样。ps:当串口接收数据不快的时候不会出错,当接收数据很快的时候,就在ArrayList中出现了null值!! to:q107770540 RemoveAt()和Remove()有什么本质区别?? 一个根据索引,一个根据Key 删除 好像不是这样的 你是两条线程在操作 一个线程 往里面填数据 一个线程看, 有种情况就是 看数据这条线程 在读 arraylist时 那个添加线程 的数据还没进去 ,所以就是空值 这就是cup 运行的时间隔 有关系 ,我原来在用线程的时 也遇到一个问题 就两条线程 感觉1条运行 比 2条快些 不好意思,昨天有点事后来下了!!!好像也不是这样,另一个线程查看arraylist数据的时候是先判断过的,只有当arraylist.count>0时才会执行。 考虑下这种情况,arraylist中只有一个元素,然后线程A B先后执行了判断代码arraylist.count>0并且都通过了判断,然后A B先后执行删除操作,会发生什么。。 建议用 List<byte> 泛型 C# SerialPort类中的DataReceived事件,本来带缓冲链表的,不用自己实现,只需一个个字符取出来就行了。比如: void COM_DataReceived(object sender, SerialDataReceivedEventArgs e) { while(BytesToRead > 0) { byte [] buf = new byte[1]; Read(buf, 0, 1); 处理字符的方法(buf[0]);//这里加处理方法就行了 } } 弄个timer 放updatepanel里 在Timer_Tick事件里写你要的东西 呵呵。我倒是奇怪了,怎么搞出timer来了~~ 当频率过高时有可能你的RemoveAt次数大于Add次数, 仔细检查一下代码 调用Synchronized()方法 ,获取一个包装过的同步版本。 做个限制吧,在小于arraylist大小范围内删除试试! 可以通过arraylist的迭代器对list进行删除或add,这样会安全一些,不然的话可能会出现混乱 相对而言 感谢各位的关注!!!!结贴了,主要原因也就是因为ArrayList是非线程安全的吧,两个线程同时操作导致了数据的不一致性。谢谢!!!!!!!!!!!! C# 启用本地连接 有关stocket通讯,服务端如何持续接收客户端命令并返回数据给客户端问题 控制axWindowsMediaPlayer控件播放速度的问题 求助,关于C#资源文件调用的问题 关于Linq to sql 更新数据库的一个问题 火力支援!DotNet中intptr转换成int型 如何全局获得鼠标移动,点击之类的消息 急救,知道GetManifestResourceStream()用法的请进 好急好急~~ 我想让FORM上的label1移动,可是却无法实现? 关于WebResponse数据流关闭问题 c#调用vc++ dll的问题
not RemoveAt()
方法冒长来。结构是这样的。
(1)在Serialport的DataReceived事件里将接收到的数据一个个用Add方法加入到ArrayList中
(2)此时,另外有个线程,while循环一直在检测ArrayList中是否有数据,若有,每次取出第一个数据,然后将取出的数据用RemoveAt()移除。就是这样。ps:当串口接收数据不快的时候不会出错,当接收数据很快的时候,就在ArrayList中出现了null值!!
好像也不是这样,另一个线程查看arraylist数据的时候是先判断过的,只有当arraylist.count>0时才会执行。
考虑下这种情况,arraylist中只有一个元素,然后线程A B先后执行了判断代码arraylist.count>0并且都通过了判断,然后A B先后执行删除操作,会发生什么。。
比如:
void COM_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
while(BytesToRead > 0)
{
byte [] buf = new byte[1];
Read(buf, 0, 1);
处理字符的方法(buf[0]);//这里加处理方法就行了
}
}
谢谢!!!!!!!!!!!!