我有一种情况,很少有对象的队列出列空.对Enqueue的唯一调用是在类本身内:
m_DeltaQueue.Enqueue(this);
Run Code Online (Sandbox Code Playgroud)
很少,null在以下代码中从此队列中出列(静态方法):
while (m_DeltaQueue.Count > 0 && index++ < count)
if ((m = m_DeltaQueue.Dequeue()) != null)
m.ProcessDelta();
else if (nullcount++ < 10)
{
Core.InvokeBroadcastEvent(AccessLevel.GameMaster, "A Rougue null exception was caught, m_DeltaQueue.Dequeue of a null occurred. Please inform an developer.");
Console.WriteLine("m_DeltaQueue.Dequeue of a null occurred: m_DeltaQueue is not null. m_DeltaQueue.count:{0}", m_DeltaQueue.Count);
}
Run Code Online (Sandbox Code Playgroud)
这是生成的错误报告:
[Jan 23 01:53:13]:m_DeltaQueue.发生null的取消:m_DeltaQueue不为null.m_DeltaQueue.count:345
关于如何在此队列中出现空值,我感到非常困惑.
在我写这篇文章时,我想知道这是否可能是线程同步的失败; 这是一个多线程应用程序,可能在另一个线程中同时发生入队或出队.
目前这是在.Net 4.0下,但它以前发生在3.5/2.0
更新:
这是我(希望是正确的)解决问题的方法,尽管下面的重要答案是同步问题,但这个解决方案已经明确了.
private static object _lock = new object();
private static Queue<Mobile> m_DeltaQueue = new Queue<Mobile>();
Run Code Online (Sandbox Code Playgroud)
排队:
lock (_lock) …Run Code Online (Sandbox Code Playgroud)