C#System.ArgumentException:目标数组不够长
我有一个从SerialPort.DataReceived方法提供的通用队列对象 调用ToArray()方法时,偶尔会出现异常“目标数组不够长”。守则: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 虽然这很可能是线程问题,但我不理解
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方法将数据读入临时字节数组。然后排队。当然,在写入之前锁定队列对象。