Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#项在很短的时间内为空?_C# - Fatal编程技术网

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

C#项在很短的时间内为空?,c#,C#,我有一个MessageQueue类,它有一个充当队列的私有List属性。只有一种方法可以添加到队列(通过add方法)和一种方法可以从队列中获取(通过Next方法)。我有一个线程毫无延迟地运行,不断地检查队列。偶尔,一个null项进入队列 如果要添加的项为空,我会在Add方法中放置一个断点,但从未命中断点 如果返回的项是null,则我在Next方法中放置了一个断点,该断点将被命中 此外,断点是在获取项目之后,但在调整队列之前设置的。奇怪的是,虽然返回的项是null,但刚刚获取的项不是null!这是

我有一个
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;
        }
    }
}
公共类消息队列
{
私有列表队列=新列表();
公共无效添加(字节[]有效负载)
{
如果(有效负载==null)
{
Console.WriteLine(“这就是为什么”);
}
添加(有效负载);
}
公共字节[]下一个()
{
字节[]hand=queue.First();
if(hand==null)
{
控制台写入线(“asdf”);
}
queue=queue.Skip(1.ToList();
回手;
}
公共广播信息
{
得到
{
返回queue.Count()>0;
}
}
}
这是排队的东西-

这是手里的东西-

因为我在队列上首先使用
,如果没有项目,就会抛出错误

事实上,为了确保这没有什么关系,我在
第一次调用的周围放了一个try-catch,它从来没有被击中过

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

列表

如果您是从不同的线程访问它,您可以看到它处于断开状态。 使用任何或任何来自


如上所述:“ConcurrentQueue最有可能是您需要使用的”

您是否碰巧有多个线程?而且,
队列
作为队列比
列表
@MitchWheat更具意义,这是肯定的
queue=queue.Skip(1.ToList()。这不是我见过的最有效的删除,但仍然是。您可能想看看ConcurrentQueue它实际上是
队列。添加(有效负载)导致数据中间保留
null
值(从并发线程中看到)。您应该添加
ConcurrentQueue
最有可能是OP需要使用的
列表不是线程安全的
-很高兴知道。这可能是我其他一些异常现象的原因。如果您不知道,请知道.net中的大多数内容都不是线程安全的,即使是DateTimestructure@Evk非常常见的错误。检查或@EugeneGorbovoy,但那是另一个故事
DateTime
仍然是线程安全的,因为它是不可变的。但是对
DateTime
类型的变量\字段的赋值和读取不是线程安全的。虽然“线程安全”这个词很模糊,所以我明白你的意思。