我有一个通用的Queue对象,它来自SerialPort.DataReceived方法。
在调用ToArray()方法时偶尔会出现“目标数组不够长”的异常。代码:
byte[] tmpArray;
try
{
tmpArray = queue.ToArray();
}
catch (Exception ex)
{
对于记录:queue.Count永远不会超过500.
虽然这很可能是一个线程问题,但我不明白这个例外。目标数组何时在队列的ToArray()方法中太短?
如果这是一个线程问题,那么从SerialPort获取数据到队列的最佳做法是什么?
BTW:我在写作之前锁定队列。也许我应该在ToArray()之前锁定它?
答案 0 :(得分:3)
我想回答我自己的问题,或者至少对奇怪的异常消息做出假设。
这更像是对异常消息的问题以及为什么框架告诉我数组太小,即使我不能创建该数组。
由于这很可能是线程相关的问题,Queue.ToArray()可以抛出异常,说“目标数组不够长”的唯一方法是当队列本身在另一个线程中增长而ToArray尝试复制它时..
ToArray方法为我们提供了一个新数组。因此,必须先分配数组,然后将数据从队列复制到数组。正如我所说,SerialPort.DataReceived事件处理程序负责向队列添加元素。如果SerialPort.DataReceived事件在分配数组后立即触发,则队列将大于数组。
框架可能很难或不可能检测到这一点。