【发布时间】:2013-11-05 08:37:59
【问题描述】:
我有一个由 SerialPort.DataReceived 方法提供的通用 Queue 对象。
调用 ToArray() 方法时,有时会出现异常“目标数组不够长”。代码:
byte[] tmpArray;
try
{
tmpArray = queue.ToArray();
}
catch (Exception ex)
{
记录一下:queue.Count 永远不会超过 500。
虽然这很可能是线程问题,但我不明白异常。队列的 ToArray() 方法中的目标数组何时会太短?
如果这是一个线程问题,那么将数据从 SerialPort 获取到队列时的最佳做法是什么?
顺便说一句:我在写之前锁定队列。也许我也应该在 ToArray() 之前锁定它?
【问题讨论】:
-
在使用队列的任何地方都需要一个锁。
Enqueue、Dequeue、ToArray等。考虑使用线程安全集合 -
你是如何实现数据接收处理程序的?
-
锁解决了这个问题。使用线程安全集合 (ConcurrentQueue) 重写的工作量太大。 ;-)
-
CloudyMarble:SerialPort.DataReceived 事件。在事件处理程序中检查 BytesToRead 是否大于 null。我使用 SerialPort.Read 方法将数据读入临时字节数组。然后入队。写之前当然要锁定Queue对象。
标签: c# thread-safety serial-port queue