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
类型的变量\字段的赋值和读取不是线程安全的。虽然“线程安全”这个词很模糊,所以我明白你的意思。