2009-07-21 56 views
12

我有一段代碼,使得在Visual Studio 2008 IDE運行速度很慢,消耗大量的內存並最終導致其崩潰。我懷疑VS正在達到操作系統內存限制。嵌套的LINQ MIN()崩潰的Visual Studio

下面的代碼不是我真正的應用程序代碼,但它模擬了這個問題。基本上我正在嘗試使用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)))))); 
    } 
} 

有沒有其他人看過類似的東西?

回答

3

前段時間我提交了bug report on MS Connect。今天早上我收到了回覆:

感謝您爲Visual Studio 2008的錯誤報告!

正如你從埃裏克利珀的博客鏈接的帖子指出,我們對我們做類型推斷這種嵌套lambda表達式在合理的時間量的能力的限制。也就是說,我們當然可以嘗試使用這種推理的時間框或者對lambda嵌套進行硬性限制來防止這種類型的問題。不幸的是,我們開始鎖定我們可以在Visual Studio 2010中修復的內容,並且我們無法在此版本中強制執行此類限制。

在規劃未來版本時,我們一定會牢記這個問題!

亞歷克斯·特納

項目經理

的Visual C#編譯器

你在微軟連接提交下列反饋項目已更新:產品/技術 - 可視化Studio和.NET Framework - 反饋ID - 476133反饋標題 - 嵌套的Linq Min()崩潰Visual Studio 200 8 IDE下面的字段或值改爲:字段狀態從[活動]更改爲[已解決]

場分辨率從[無]更改爲[不會解決]

3

我能夠在我的Visual Studio 2008安裝中重新生成此代碼。看起來語言服務正在發生無限循環並最終耗盡內存。你能否在連接網站上提交錯誤?

連接:http://connect.microsoft.com

如果你的文件錯誤,請添加評論,我的回答與bug數。

+0

我正在使用原始海報,並在我的登錄頁面提交了錯誤報告:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=476133 – geofftnz 2009-07-22 00:11:17

0

你甚至不必走那麼遠。 VS在輸入嵌套LINQ表達式的d部分時凍結了我。

3

嵌套拉姆達類型推斷表達式takes exponential time。所以當您執行太多嵌套時,編譯器變慢並不奇怪。

但是,IDE理想地將處理此類案件和中止類型推斷如果時間太長。

+1

我將您的鏈接等添加爲評論在錯誤報告。要求MS解決NP-Hard問題可能太多了,但你的超時想法是一個好主意。 – geofftnz 2009-07-22 01:41:29

0

想過我會指出,這也凍結VS 2010,以及更重要的是它幾乎凍結了我的整個系統!

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(); 
    } 
} 

正如瑞恩Versaw指出日益複雜,你也可以做到這一點沒有擴展方法,像這樣:

public class Test 
{ 
    public int val; 
    public List<Test> Tests; 

    public int Min() 
    { 
     return Math.Min(val,Tests.Min(x => x.Min())); 
    } 
} 
+1

這是我立即想到的同樣的解決方案。我會指出,如果你沒有控制你的Test類(或者它只用於測試,並且沒有正常的方法),那麼這個擴展方法是非常必要的。 – 2009-07-22 16:06:44

0

我想我剛剛經歷的東西類似。我正在瀏覽我的代碼,並在我聲明和初始化變量爲new SomeClass()的行上使用了var。我的代碼編譯。當我嘗試運行任何Visual Studio 2008單元測試時,Visual Studio將與CLR20r3一起作爲錯誤名稱/類型崩潰。恢復所有我的var更改,測試運行良好。