我有一个通用的Queue对象,它是从SerialPort.DataReceived方法提供的。
有时,在调用ToArray()方法时会出现异常“目标数组不够长”。代码:
byte[] tmpArray;
try
{
tmpArray = queue.ToArray();
}
catch (Exception ex)
{
记录:queue.Count永远不会超过500。
尽管这很可能是线程问题,但我不理解该异常。什么时候目标数组在队列的ToArray()方法中会太短?
如果这是线程问题,那么从串行端口向队列获取数据时的最佳实践是什么?
顺便说一句:我写之前锁定队列。也许我也应该在ToArray()之前将其锁定?
我想回答我自己的问题,或者至少对奇怪的异常消息给出一个假设。
这更像是对异常消息的问题,为什么框架告诉我一个数组太小,即使创建该数组不由我决定。
由于这很可能是与线程相关的问题,所以Queue.ToArray()抛出异常的唯一途径是,“目标数组不够长”是当队列本身在另一个线程中增长而ToArray试图复制它时。
ToArray方法为我们提供了一个新的数组。因此,必须首先分配该阵列,然后将数据从队列复制到该阵列。如我所说,SerialPort.DataReceived事件处理程序负责将元素添加到队列中。如果在分配数组后立即触发SerialPort.DataReceived事件,则队列将大于数组。
框架很难或不可能检测到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句