我有一个MessageQueue类,其中包含一个充当队列的私有List属性.只有一种方法可以添加到队列中(通过Add方法)和一种从队列中获取的方法(通过Next方法).我有一个线程运行没有延迟不断检查队
如果要添加的项为null,我在Add方法中放置一个断点,但是从不命中断点.
如果返回的项目为null,那么我会在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,所以如果没有项目则会抛出错误.
事实上,为了确保与某种方式无关,我在第一次调用中放置了一个try-catch,它永远不会被击中.
如果从未将null添加到队列中,并且队列中的第一项不为空,那么hand null如何?
列表与LT;> is not thread safe如果您从不同的线程访问它,您可以看到它处于损坏的状态.
使用synchronization technique或thread-safe collections中的任何内容
如上所述:“ConcurrentQueue很可能是您需要使用的”