Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#System.ArgumentException:目标数组不够长_C#_Thread Safety_Serial Port_Queue - Fatal编程技术网

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

C#System.ArgumentException:目标数组不够长,c#,thread-safety,serial-port,queue,C#,Thread Safety,Serial Port,Queue,我有一个从SerialPort.DataReceived方法提供的通用队列对象 调用ToArray()方法时,偶尔会出现异常“目标数组不够长”。守则: byte[] tmpArray; try { tmpArray = queue.ToArray(); } catch (Exception ex) { 记录如下:队列。计数从不超过500 虽然这很可能是线程问题,但我不理解

我有一个从SerialPort.DataReceived方法提供的通用队列对象

调用ToArray()方法时,偶尔会出现异常“目标数组不够长”。守则:

        byte[] tmpArray;

        try
        {
            tmpArray = queue.ToArray();
        }
        catch (Exception ex) 
        {
记录如下:队列。计数从不超过500

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

如果这是一个线程问题,那么在将数据从串行端口获取到队列时,最佳做法是什么


顺便说一句:我在写之前锁定了队列。也许我也应该在ToArray()之前锁定它?

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

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

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

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


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

在使用队列的任何地方都需要一个锁<代码> Enqueue < /代码>,代码> DEQueSE/<代码>,<代码> ToArray <代码>等。考虑使用线程安全收集显示,您是否实现了数据接收处理程序?锁定解决了问题。使用线程安全集合(ConcurrentQueue)重写太多工作了。;-)CloudyMarble:SerialPort.DataReceived事件。在事件处理程序内部,检查BytesToRead是否大于null。我使用SerialPort.read方法将数据读入临时字节数组。然后排队。当然,在写入之前锁定队列对象。