C#System.ArgumentException:目标数组不够长

时间:2013-11-05 08:38:00

标签: c# thread-safety serial-port queue

我有一个通用的Queue对象,它来自SerialPort.DataReceived方法。

在调用ToArray()方法时偶尔会出现“目标数组不够长”的异常。代码:

        byte[] tmpArray;

        try
        {
            tmpArray = queue.ToArray();
        }
        catch (Exception ex) 
        {

对于记录:queue.Count永远不会超过500.

虽然这很可能是一个线程问题,但我不明白这个例外。目标数组何时在队列的ToArray()方法中太短?

如果这是一个线程问题,那么从SerialPort获取数据到队列的最佳做法是什么?

BTW:我在写作之前锁定队列。也许我应该在ToArray()之前锁定它?

1 个答案:

答案 0 :(得分:3)

我想回答我自己的问题,或者至少对奇怪的异常消息做出假设。

这更像是对异常消息的问题以及为什么框架告诉我数组太小,即使我不能创建该数组。

由于这很可能是线程相关的问题,Queue.ToArray()可以抛出异常,说“目标数组不够长”的唯一方法是当队列本身在另一个线程中增长而ToArray尝试复制它时..

ToArray方法为我们提供了一个新数组。因此,必须先分配数组,然后将数据从队列复制到数组。正如我所说,SerialPort.DataReceived事件处理程序负责向队列添加元素。如果SerialPort.DataReceived事件在分配数组后立即触发,则队列将大于数组。

框架可能很难或不可能检测到这一点。