C# 队列溢出问题(急,在线等)
各位易做图:我在一个Sockt编程项目中需要将客户端发送过来的消息放入 (remoting对像)队列中 等待 另一个处理程序来处理。这个消息量特别大,一秒500次以上并发(作客户端监控的),程序在运行三四天后出异常(在入队操作时):System.ArgumentException: Source array was not long enough. Check srcIndex and length, and the array's lower bounds.
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
at System.Collections.Queue.SetCapacity(Int32 capacity)
at System.Collections.Queue.Enqueue(Object obj)
at RemoteObject.MyMessageQueue.EnQueue(Object o)
队列出、入队操作 都是经过加锁了。是什么原因? --------------------编程问答-------------------- 搂主的队列长度超出了整型int的MaxValue --------------------编程问答-------------------- 建议搂主这个队列做成:“队列的队列”模式
也就是说:如果一个队列达到最大长度,那么就把数据放到相邻的下一个队列
长度判断方法:
if(队列.Length>=int.MaxValue)
{
把数据放到下一个队列;
} --------------------编程问答-------------------- Int 最大值为 2147483647,三四天之内达到这个消息 算下来差不多。 难道是我的处理程序没有从中读到数据进行处理(也就是没有出队,只有入队)造成的? --------------------编程问答-------------------- 准备学Sockt编程~ --------------------编程问答-------------------- 那就不清楚了,要看搂主自己的代码了,估计是没有进行出队操作 --------------------编程问答-------------------- 从日志来看肯定是做了出队操作的,因为每条消息在处理完成后,都会记录到日志文件并写到数据库中 观察了一下日志,是正常的,处理速度也没有太大的悬殊(入太快,出太慢)。 在网上查了些资料 说有可能是.net 运行库有问题…… 现在就搞不清楚……郁闷…… --------------------编程问答-------------------- 看你的入队频率那么高,有可能是搂主的出队和入队不同步造成的
也就是一次入队500个,同时出队才出一个,也会出现搂主的问题的
--------------------编程问答-------------------- 嗯,楼上说的有道理。 还有就是 我在new Queue的时候没有指定增长因子,它默认以2倍的速度递增,Int32的最大值为 2147483647 那如果当我的元素个数大于 2147483647/2 时它还会按2培速增长吗? 如果在*2 的时候超出了Int32的 MaxValue 会不会出这种异常? 这个增长因子最好怎么指定? --------------------编程问答-------------------- 晕,我才发现在处理程序的监听线程中 我加了个Thread.Sleep(200); 应该是这个问题了。 改成Thread.Sleep(5) 试试, 不过一般一这里的话,应该Sleep(N) 多少呢? 以避免服务器CPU资源占用 100% 呢? --------------------编程问答-------------------- Int32的最大值为 2147483647 那如果当我的元素个数大于 2147483647/2 时它还会按2培速增长吗?
肯定会的
如果在*2 的时候超出了Int32的 MaxValue 会不会出这种异常?
肯定会的
最好用默认值 --------------------编程问答-------------------- 噢,看了下,默认值是2
另外,用0也可以,在入队的时候要判断count是否已经等于MaxValue了 --------------------编程问答-------------------- ding --------------------编程问答-------------------- 回搂主9楼,
呵呵,那我就不清楚了,因为不知道搂主具体流程什么的 --------------------编程问答-------------------- 顶
补充:.NET技术 , C#