我有一段代码使得Visual Studio 2008 IDE运行速度非常慢,占用大量内存,最终导致崩溃。我怀疑VS正在达到操作系统内存限制。
以下代码不是我真正的应用程序代码,但它模拟了问题。基本上我试图使用LINQ在树中找到最小值。
class LinqTest
{
public class test
{
public int val;
public List<test> Tests;
}
private void CrashMe()
{
test t = new test();
//Uncomment this to cause the problem
//var x = t.Tests.Min(c => c.Tests.Min(d => d.Tests.Min(e => e.Tests.Min(f=>f.Tests.Min(g=>g.Tests.Min(h => h.val))))));
}
}
还有其他人看过类似的东西吗?
答案 0 :(得分:3)
我能够在我的Visual Studio 2008安装上重新启用它。看起来语言服务正在无限循环并最终耗尽内存。你能否在连接网站上提交一个错误?
连接:http://connect.microsoft.com
如果您确实提交了错误,请在错误编号上添加评论。
答案 1 :(得分:3)
嵌套lambda表达式takes exponential time的类型推断。因此,当您进行太多嵌套时,编译器会变慢并不奇怪。
但是,理想情况下,IDE会处理此类情况,并且如果花费的时间太长,则会中止类型推断。
答案 2 :(得分:3)
前一段时间我提交了bug report on MS Connect。今天早上我收到了回复:
感谢Visual Studio 2008的错误报告!
正如你在Eric Lippert博客的链接帖子中指出的那样,我们限制了我们在合理的时间内对这种嵌套的lambda表达式进行类型推断的能力。也就是说,我们当然可以尝试对这种推断进行时间限制或对lambda嵌套设置硬性限制以防止此类问题。不幸的是,我们开始锁定我们在Visual Studio 2010中可以修复的内容,并且我们将无法在此版本中强制执行此类限制。
在规划未来版本时,我们一定会记住这个问题!
Alex Turner
项目经理
Visual C#编译器
和
您在Microsoft Connect上提交的以下反馈项已更新:产品/技术 - Visual Studio和.NET Framework - 反馈ID - 476133反馈标题 - 嵌套Linq Min()崩溃Visual Studio 2008 IDE以下字段或值已更改:字段状态从[有效]更改为[已解决]
字段分辨率从[无]更改为[无法修复]
答案 3 :(得分:1)
使用基本递归而不是试图“猜测”深度,增加每个级别的复杂性
public static class TestExt
{
public static int Min(this Test test)
{
return Math.Min(test.val, test.Tests.Min(x => x.Min()));
}
}
public class Test
{
public int val;
public List<Test> Tests;
}
public class LinqTest
{
public void GetMin()
{
Test t = new Test();
var min = t.Min();
}
}
正如Ryan Versaw指出的那样,你也可以不用像这样的扩展方法来做到这一点:
public class Test
{
public int val;
public List<Test> Tests;
public int Min()
{
return Math.Min(val,Tests.Min(x => x.Min()));
}
}
答案 4 :(得分:0)
你甚至不必走那么远。在键入嵌套LINQ表达式的d
部分时,VS为我冻结。
答案 5 :(得分:0)
我想我会指出它也会冻结VS 2010,而且它几乎冻结了整个系统!
答案 6 :(得分:0)
我想我刚刚经历过类似的事情。我正在浏览我的代码,并在我声明并将变量初始化为var
的行上使用new SomeClass()
。我的代码已编译。当我尝试运行任何Visual Studio 2008单元测试时,Visual Studio会因CLR20r3作为错误名称/类型而崩溃。恢复我的所有var
更改,测试运行正常。