我试图将值放入队列中,并且工作正常。该程序运行几个小时后,出现以下错误

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


我每100毫秒排队一次值,并且有一个任务从队列中出队。队列没有增加,其数量在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

最佳答案

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

从Callstack中,我可以看到在Enqueue操作期间调整了队列的大小。显然,与此同时,出队操作已经缩小了内部数组,从而导致参数异常。尝试改用ConcurrentQueue并再次检查。

编辑:链接到最新文档。

关于c# - 排队添加多个值时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50129243/

10-09 16:04