c#多线程队列项为空

时间:2013-07-21 07:02:47

标签: c# .net multithreading queue

我的应用程序是一个多线程应用程序。我使用线程和任务来使用锁从~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个线程使用队列

1 个答案:

答案 0 :(得分:0)

  

这是不可能的,因为在出​​列前一项之前你无法触摸第五项。

当从多个线程使用非线程安全的集合时,该推理不成立。种族状况可能导致各种症状。

最好的办法是检查你的锁定情况。如果可能,发布代码的模型。

----编辑----:

之后

你没有锁定Enqueue。基本修复:

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