并发Dict不会阻止项在循环内为null

时间:2014-01-20 14:13:19

标签: c# multithreading mmo

foreach (KeyValuePair<uint, Character> kvp in World.AllChars)
{
    Character Charr = kvp.Value;
    Charr.Do(); <-- NullrefException: Charr is null
}

带支票的代码:

foreach (KeyValuePair<uint, Character> kvp in World.AllChars)
{
    Character Charr = kvp.Value;
    if(Charr != null)
    {
       Charr.Do(); <-- NullrefException: Charr is null
    }
}

编辑:

Do()内部没有任何内容导致它为null,因为它甚至不执行Do()因为Charr为null。

这就是我的循环的样子。我已经尝试过if!= null检查,但它仍然会超过它并抛出一个nullref异常。

我该怎样防止这种情况?我使用的是Concurrent Dictionary和高度多线程的服务器架构。

2 个答案:

答案 0 :(得分:1)

问题提到您检查null,但不清楚您正在做哪个值。请考虑以下代码

Character Charr = kvp.Value;
if (Charr != null) { 
  Charr.Do();
}

在这种情况下,Char无法成为nullCharr的成员可能是null,因此Do方法会抛出。如果是这种情况,尽管Character类型可能不适合多线程场景(至少它们的使用方式)

答案 1 :(得分:0)

如果您对Charr添加了空检查并仍然获得空引用异常,Do()方法中的某些内容将导致此异常。检查异常的调用堆栈或/并使用调试器逐步完成代码。