C# 无法计算表达式,因为线程在无法进行垃圾收集的点停止

C# 无法计算表达式,因为线程在无法进行垃圾收集的点停止,c#,.net,linq,C#,.net,Linq,这里是错误 无法计算表达式,因为线程在无法进行垃圾收集的位置停止,可能是因为代码已优化 我正在编写一个简单的控制台应用程序,第一行代码如下: List<MyObjectModel> list = MyObjectModel.GetNonCompletedReturns(); List List=MyObjectModel.GetNonCompletedReturns(); 该函数的代码为: public static List<MyObjectModel> GetNo

这里是错误

无法计算表达式,因为线程在无法进行垃圾收集的位置停止,可能是因为代码已优化

我正在编写一个简单的控制台应用程序,第一行代码如下:

List<MyObjectModel> list = MyObjectModel.GetNonCompletedReturns();
List List=MyObjectModel.GetNonCompletedReturns();
该函数的代码为:

public static List<MyObjectModel> GetNonCompletedReturns()
{
    MyObject service = new MyObject();
    List<MyObject> entities = 
                      (from recs in service.Retrieve() where select recs).ToList();

    List<MyObjectModel> models = new List<MyObjectModel>();

    foreach (MyObject entity in entities)
    {
        models.Add(BindModel(entity));
    }

    return models;
}
publicstaticlist GetNonCompletedReturns()
{
MyObject服务=新的MyObject();
列出实体=
(从服务中的recs.Retrieve()中选择recs.ToList();
列表模型=新列表();
foreach(实体中的MyObject实体)
{
添加(绑定模型(实体));
}
收益模型;
}
如果我尝试单步执行代码,只要我回到应用程序的主界面并将鼠标悬停在列表上,我就会收到显示的错误消息


有人能帮忙吗?

此错误仅在调试期间尝试使用
监视
对话框时触发。
尝试使用其他技术输出变量,如
Debug.WriteLine
Console.WriteLine
等等。

如果您的项目是在发行版中编译的(启用了优化),您可能会看到这一点。您尝试过调试配置吗?

当我从第三方控件中点击
NullReferenceException
时,我也得到了这个消息

在这一个例子中,我发现如果我在遇到异常之前设置了一个断点,那么我就可以一步完成代码的其余部分,而不会看到问题


不知道为什么,但这对我很有效——至少在这种情况下是这样。

没有一个答案解决了我的问题,所以我发布了帮助我的答案

“如果参数中的数据过多,则可能发生此错误, 一个简单的解决方案是创建一个对象,而不是一个结构,因为它是一个数据对象

将此对象放入参数中,而不是所有不同的变量,
正常情况下,该问题将不再发生。”

值得一提的是,这个错误也可能是由属性getter中的无限循环引起的(下面的简化版本)。当调试器尝试计算属性时(例如,在“监视”窗口中),UI将挂起几秒钟,同一类中的许多其他属性将出现“无法计算表达式…”错误

public int MyProperty
{
    get
    {
        while (true) { }
        return 0;
    }
}

这里有一个小技巧,以防您想要检查某些对象,但无法更改参数:


我已经创建了一个对新临时函数的调用,在函数内部,我无法观察我的对象。然后,在这个新功能中,我能够观察我的对象。作业完成后,只需删除该函数。

如果Visual Studio的解决方案配置为
发布
,请切换到
调试
,同时“无法计算表达式,因为线程在无法进行垃圾收集的点停止,可能是因为代码已优化”在发布模式下出现错误,大多数开发人员只需确保他们的项目配置为编译为调试版本。但为了确保没有发布DLL问题,还必须检查解决方案中对DLL的引用,并确保没有对发布版本DLL的引用。如果发现是这种情况,请删除DLL引用,然后添加项目引用而不是DLL引用。项目引用将确保解决方案引用生成配置中指定的DLL调试或发布版本


请注意,上述建议当然只适用于那些具有源代码并且是从解决方案中的项目生成的DLL

首先确保在调试模式下运行代码,并关闭代码优化。您可以从项目的属性中禁用该选项

如果您完成了上述所有操作,但问题仍然存在,那么可能是堆栈顶部有
Debug.Break()
的问题。解决方法非常简单,只需按
F10
移动到下一行,您就可以计算表达式


您可以查看有关此问题的详细信息。

在计算linq表达式时,我在Visual Studio调试器中遇到了相同的错误消息

禁用VS调试器配置设置“仅启用我的代码”为我解决了问题:

要仅启用或禁用我的代码,请选择中的“工具”>“选项”菜单 Visual Studio。在调试>常规节点中,选择或清除启用 只是我的代码


我在Visual Studio 2017中遇到了同样的问题。转到“调试>选项>调试>常规”并选中“在模块加载时抑制JIT优化(仅管理)”修复了我的问题

为什么将此标记为asp.net?在发布多个问题的复制粘贴样板/逐字回答时,请小心,这些问题往往会被社区标记为“垃圾邮件”。如果您这样做,那么通常意味着问题是重复的,所以请将它们标记为:我的项目是在调试中编译的,没有优化。谢谢!我在构建过程中启用了“代码优化”。这可能会弄乱调试符号。是的,这是我的解决方案,我试图在发布模式下运行时进行调试。这似乎是一个严重的设计缺陷-在调试过程中无法观察变量?我认为,自最初的问题以来,这种行为一直受到影响。我从来没有在VS 2015I中遇到过它。我在VS2015中遇到过它(这就是我如何回答这个问题的原因)。您的监视操作可能很耗时,并且监视对话框有一个评估超时。我们可以对监视对话框超时做些什么吗?我们可以更改设置使其不超时?