C#项目在很短的时间内为空?

时间:2018-03-18 23:20:14

标签: c#

我有一个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;
        }
    }
}

这是队列中的内容 -

enter image description here

这就是手中的内容 -

enter image description here

因为我在队列中使用First,所以如果没有项目则会引发错误。

事实上,为了确保与某种方式没有关系,我在First电话周围放了一个尝试 - 它从未被击中过。

如果从未将null添加到队列中,并且队列中的第一项不为空,那么hand如何为null?

1 个答案:

答案 0 :(得分:6)

列表与LT;&GT; is not thread safe

如果您从不同的线程访问它,您可以看到它处于损坏的状态。 使用synchronization techniquethread-safe collections

中的任何内容

如上所述:&#34; ConcurrentQueue很可能是您需要使用的&#34;