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

Jef*_*lin 2 c# queue serial-port thread-safety

我有一个通用的 Queue 对象,它是从 SerialPort.DataReceived 方法提供的。

调用 ToArray() 方法时,有时会出现异常“目标数组不够长”。编码:

        byte[] tmpArray;

        try
        {
            tmpArray = queue.ToArray();
        }
        catch (Exception ex) 
        {
Run Code Online (Sandbox Code Playgroud)

作为记录:queue.Count 永远不会超过 500。

虽然这很可能是线程问题,但我不理解异常。队列的 ToArray() 方法中的目标数组何时会太短?

如果这是一个线程问题,那么在将数据从 SerialPort 获取到队列时的最佳实践是什么?

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

Jef*_*lin 5

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

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

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

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

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