问题描述
各位大师:我在一个Sockt编程项目中需要将客户端发送过来的消息放入(remoting对像)队列中等待另一个处理程序来处理。这个消息量特别大,一秒500次以上并发(作客户端监控的),程序在运行三四天后出异常(在入队操作时):System.ArgumentException:Sourcearraywasnotlongenough.ChecksrcIndexandlength,andthearray'slowerbounds.atSystem.Array.Copy(ArraysourceArray,Int32sourceIndex,ArraydestinationArray,Int32destinationIndex,Int32length,Booleanreliable)atSystem.Collections.Queue.SetCapacity(Int32capacity)atSystem.Collections.Queue.Enqueue(Objectobj)atRemoteObject.MyMessageQueue.EnQueue(Objecto)队列出、入队操作都是经过加锁了。是什么原因?
解决方案
解决方案二:
搂主的队列长度超出了整型int的MaxValue
解决方案三:
建议搂主这个队列做成:“队列的队列”模式也就是说:如果一个队列达到最大长度,那么就把数据放到相邻的下一个队列长度判断方法:if(队列.Length>=int.MaxValue){把数据放到下一个队列;}
解决方案四:
Int最大值为2147483647,三四天之内达到这个消息算下来差不多。难道是我的处理程序没有从中读到数据进行处理(也就是没有出队,只有入队)造成的?
解决方案五:
准备学Sockt编程~
解决方案六:
那就不清楚了,要看搂主自己的代码了,估计是没有进行出队操作
解决方案七:
从日志来看肯定是做了出队操作的,因为每条消息在处理完成后,都会记录到日志文件并写到数据库中观察了一下日志,是正常的,处理速度也没有太大的悬殊(入太快,出太慢)。在网上查了些资料说有可能是.net运行库有问题……现在就搞不清楚……郁闷……
解决方案八:
看你的入队频率那么高,有可能是搂主的出队和入队不同步造成的也就是一次入队500个,同时出队才出一个,也会出现搂主的问题的
解决方案九:
嗯,楼上说的有道理。还有就是我在newQueue的时候没有指定增长因子,它默认以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楼,呵呵,那我就不清楚了,因为不知道搂主具体流程什么的
解决方案十五:
顶