C# 系统参数异常 : Destination array was not long enough

标签 c# thread-safety serial-port queue

我有一个通用队列对象,它由 SerialPort.DataReceived 方法提供。

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

        byte[] tmpArray;

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

郑重声明:queue.Count 永远不会超过 500。

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

如果这是线程问题,那么将数据从串行端口获取到队列时的最佳实践是什么?

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

最佳答案

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

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

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

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

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

关于C# 系统参数异常 : Destination array was not long enough,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784704/

相关文章:

c# - Entity Framework 演示项目

c# - 读取位对齐数据

c# - 将 List<int> 转换为字符串,反之亦然?

java - String线程安全吗?

c# - 将一组 Sitecore 子项作为其父项编制索引

java - 我可以使用什么来代替 Java 中的 Vector?

c - 关于线程和变量复制的简单问题(无需同步)

c++ - QSerialPort 能否读取超过 512 字节的数据?

java - nrjavaserial 和对/var/lock 的权限(链接到/run/lock)

c# - 如何从串口读取数据并写入串口?