我的应用程序是一个多线程应用程序。我使用线程和任务使用锁从〜4个队列中将项目入队和出队。有时,当我出队时,该项目为空,当我查看队列内部时,我可以看到其他一些项目也为空(例如,第 5 个项目为空)。每当我入队时,我总是创建一个新项目,所以它是 null 是不可能的。起初我以为另一个线程正在弄乱我的物品。但是当我看到第 5 项也是空的,而第 3、第 4 和第 2 项不是时,我意识到这是不可能的,因为在出列之前的项目之前你不能触摸第 5 项。我不能分享我的代码。有人熟悉这种情况吗?可能是什么原因?
----------------------------------编辑--------------- --------------
使队列入队的类继承自串行端口并像这样入队:
if(BytesToRead>0)
{
byte[] data=new byte[BytesToRead];
Read(data,0,data.length)
MyClass c=new MyClass(){m_data=data, m_tod=DateTime.Now};
_dataQueue.Enqueue(c);
}
和出队的类不同,但想法是相似的:
lock(_sync)
{
var item=_dataQueue.dequeue();
}
当我出队时,我得到空值。正如你所看到的,我使用DateTime.Now
它真的很奇怪,它变为空。我的意思是如果一个线程使用它,那么该项目不应该在那里吗?每个使用队列的类都有它的副本。并且在每个类中大约有 3 个线程使用队列