首页 文章

c#多线程队列项为空

提问于
浏览
0

我的应用程序是一个多线程应用程序 . 我使用线程和任务来使用锁从~4队列中排队和出队 . 有时候,当我出队时,该项为空,当我查看队列内部时,我可以看到其他一些项也是空的(例如第5项为空) . 每当我入队时我总是创建一个新项目,所以它是null是不可能的 . 起初我以为另一个线程正在弄乱我的物品 . 但是当我看到第5项也是空的时候,而第3,第4和第2项并不是我意识到这是不可能的,因为你不能触及第5项而不是先前的项目 . 我无法分享我的代码 . 有人熟悉这种情况吗?可能是什么原因?

---------------------------------- EDIT --------------- --------------
排队队列的类继承自串口并排队如下:

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

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

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

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

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

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

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

相关问题