添加多个值时排队错误

时间:2018-05-02 07:29:50

标签: c#

我正在尝试将值排入队列并且工作正常。当程序运行几个小时后,我收到以下错误

System.ArgumentException: length
  at System.Array.Copy (System.Array sourceArray, System.Int32 sourceIndex, System.Array destinationArray, System.Int32 destinationIndex, System.Int32 length) [0x000c3] in <f56c876907e742b0aa586f051fcce845>:0 
  at System.Collections.Generic.Queue`1[T].SetCapacity (System.Int32 capacity) [0x0001e] in <ccafeb0e74bd436bb84e5138772c2bb0>:0 
  at System.Collections.Generic.Queue`1[T].Enqueue (T item) [0x0003e] in <ccafeb0e74bd436bb84e5138772c2bb0>:0 
  at VSCaptureMP.MPudpclient.ExportWaveToCSV () [0x0010a] in <f1c552d4f5b3424d9438ec1100580a9d>:0 
  at VSCaptureMP.MPudpclient.PollPacketDecoder (System.Byte[] packetbuffer, System.Int32 headersize) [0x00121] in <f1c552d4f5b3424d9438ec1100580a9d>:0 

我每百毫秒排队一次,我有一个从队列中出队的任务。队列没有增加,其数量在250到500之间。可能是什么问题?我也尝试过ConcurrentQueue。然后该程序运行时间更长,但在12小时后它给出了以下例外:

at (wrapper alloc) System.Object.AllocVector(intptr,intptr) 
at System.Collections.Concurrent.ConcurrentQueue1+Segment[T]..ctor (System.Int32 boundedLength) [0x00006] in <f56c876907e742b0aa586f051fcce845>:0 
at System.Collections.Concurrent.ConcurrentQueue1[T].EnqueueSlow (T item) [0x00051] in <f56c876907e742b0aa586f051fcce845>:0 
at System.Collections.Concurrent.ConcurrentQueue`1[T].Enqueue (T item) [0x00010] in <f56c876907e742b0aa586f051fcce845>:0

1 个答案:

答案 0 :(得分:5)

根据您描述的内容,我认为您的潜在问题可能是由竞争条件引起的。列表之类的队列在内部使用数组,并在需要时调整它们的大小。他们以2的幂来做,例如128,256和512,它们恰好与您的计数边界对齐。调整大小意味着创建一个新数组(更小或更大)并将内容复制到新数组,可以进行Array.Copy()调用。

从Callstack中我可以看到队列在Enqueue操作期间调整大小。显然,在平均时间内,dequeue操作已经缩小了内部数组,导致了参数异常。请尝试使用ConcurrentQueue,然后重新检查。

修改:链接到最新文档。