我有一个MessageQueue
类,其中一个私有List
属性充当队列。只有一种方法可以添加到队列中(通过Add
方法)和一种从队列中获取的方法(通过Next
方法)。我有一个线程运行没有延迟不断检查队列。有时,null
项会进入队列。
如果要添加的项为null,则在Add
方法中放置一个断点,但断点永远不会被命中。
如果返回的项目是Next
,那么我会在null
方法中放置一个断点,这会受到影响。
此外,断点在获取项目之后但在调整队列之前设置。奇怪的是,当返回的项目为null
时,刚刚获取的项目不为空!这是我的队列 -
public class MessageQueue
{
private List<byte[]> queue = new List<byte[]>();
public void Add(byte[] payload)
{
if (payload == null)
{
Console.WriteLine("thats why");
}
queue.Add(payload);
}
public byte[] Next()
{
byte[] hand = queue.First();
if(hand == null)
{
Console.WriteLine("asdf");
}
queue = queue.Skip(1).ToList();
return hand;
}
public bool HasMessages
{
get
{
return queue.Count() > 0;
}
}
}
这是队列中的内容 -
这就是手中的内容 -
因为我在队列中使用First
,所以如果没有项目则会引发错误。
事实上,为了确保与某种方式没有关系,我在First
电话周围放了一个尝试 - 它从未被击中过。
如果从未将null添加到队列中,并且队列中的第一项不为空,那么hand
如何为null?
答案 0 :(得分:6)
列表与LT;&GT; is not thread safe
如果您从不同的线程访问它,您可以看到它处于损坏的状态。 使用synchronization technique或thread-safe collections
中的任何内容如上所述:&#34; ConcurrentQueue很可能是您需要使用的&#34;