c#多线程队列项为null

本文关键字:null 队列 多线程 | 更新日期: 2023-09-27 18:24:01

我的应用程序是一个多线程应用程序。我使用线程和任务对使用锁的~4个队列中的项目进行入队和出队。有时,当我出列时,项目为null,当我查看队列内部时,我可以看到其他一些项目也为null(例如,第5个项目为null)。每当我排队时,我总是创建一个新项,所以它不可能为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();
}

当我出列时,我得到了null。正如你所看到的,我使用DateTime.Now,所以它真的很糟糕,它变成了null。我的意思是,如果一个线程使用了这个,那么项目就不应该在那里,对吧?每个使用队列的类都有它的副本。在每个类中,大约有3个线程使用队列

c#多线程队列项为null

这是不可能的,因为在前一个项目排队之前,你不能触摸第五个项目。

当从多个线程使用一个不安全的集合时,这种推理就不成立了。种族状况会导致各种各样的症状。

所以最好的办法是检查你们的锁。如果可能的话,发布一个代码的模型。

----编辑----之后:

您没有锁定排队。基本修复:

//_dataQueue.Enqueue(c);
lock(_sync)
{
   _dataQueue.Enqueue(c);
}