gpt4 book ai didi

C# : Obscure object ref error

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:34 25 4
gpt4 key购买 nike

拥有一个运行良好一段时间的应用程序。突然之间,它开始在产品服务器上的某行代码处抛出间歇性的“对象引用未设置...”错误。

我在 Visual Studio 中启动该应用程序并在有问题的代码行处使用断点对其进行调试,并复制了一个非常奇怪的行为。

最初,当 VS 在代码断点处中断时,变量为 NULL,但如果我等待 5 秒左右,则变量不再为 NULL。这可以通过在 VS 的即时窗口中调用变量来加速,这会导致 NULL 字段立即填充或解析。这是生产服务器上错误的确切间歇性。

有什么想法可以从哪里开始?在调用方法之前将数据加载到变量中,但由于某种原因,在内存中引用变量时会出现滞后。开发和生产服务器上的可用内存堆。

真的很奇怪...需要帮助找到一个地方开始解决它。

提前致谢。

信息:.NET 3.5、VS 2008

代码:

public static List<Model> CreateModel(List<subModelA> subModelAs, List<subModelB> subModelBs, int duration, bool isGroup) {
List<Model> result = new List<Model>();

try {
if (subModelAs != null && subModelAs.Count > 0) {
if (subModelBs != null && subModelBs.Count > 0) {

subModelBs.ForEach(b => {
subModelA a = subModelAs.Find(x => x.id == b.comp[0].subModelAComp.subModel.id);
result.Add(CreateNewModel(a, b, duration));
});
}
}
}
catch (Exception ex) {
throw ex;
}
return result;
}

下面一行是问题的根源:

subModelA a = subModelAs.Find(x => x.id == b.comp[0].subModelAComp.subModel.id);

如果有时 b 为 NULL 而其他时候 subModelAComp 为 NULL。如果我在这一行断点并在立即窗口中执行“b.comp[0].subModelAComp”,则它为 NULL,然后我执行“b”,然后再次执行“b.comp[0].subModelAComp”,它是不再为空。对“b”的调用似乎强制“subModelAComp”不为 NULL。 getter 中没有可能导致此更改的代码。

*** 应用程序未线程化。没有实现多线程 ****

最佳答案

没有看到任何代码,这很难说,但有两种可能性:

  • 这绝对是一个变量,还是一个属性?如果它是一个属性,评估一次可能会给出一个非空值,但第二次评估可能是空值

  • 是否涉及多个线程?如果是这样,则存在两个潜在问题:

    • 如果数据在一个线程中设置但在另一个线程中读取,“设置”线程可能已经写入它,但由于缓存等原因,“读取”线程没有读取它。有多种解决方法 - 的最简单的是在访问共享数据之前始终获取锁。 (对同一数据的每次访问都使用相同的锁。)
    • 另一个线程可能将该值设置为 null - 所以您会看到它是非 null,然后是 null

您可以向我们展示的任何代码都会有所帮助。

关于C# : Obscure object ref error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com