2009-07-21 10 views
12

Possiedo un pezzo di codice che rende l'IDE di Visual Studio 2008 molto lento, consuma grandi quantità di memoria e quindi causa l'arresto anomalo. Sospetto che VS stia colpendo un limite di memoria del sistema operativo.Nested Linq Min() arresta inaspettatamente Visual Studio

Il seguente codice non è il mio vero codice di applicazione, ma simula il problema. In sostanza sto cercando di trovare il valore minimo all'interno di un albero usando 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)))))); 
    } 
} 

Qualcun altro ha visto qualcosa di simile?

risposta

3

Qualche tempo fa ho inviato un bug report on MS Connect. Stamattina ho ricevuto una risposta:

Grazie per il bug report di Visual Studio 2008!

Come si indica nel post collegato dal blog di Eric Lippert, abbiamo limiti sulla nostra capacità di fare inferenza di tipo su espressioni lambda annidate in un ragionevole lasso di tempo. Detto questo, potremmo certamente provare a timebox tale inferenza o porre un limite estremo al nesting di lambda per prevenire questo tipo di problema. Sfortunatamente, stiamo iniziando a bloccare ciò che possiamo correggere in Visual Studio 2010 e non saremo in grado di applicare tali limiti in questa versione.

Sicuramente terremo presente questo problema quando pianifichiamo le versioni future!

Alex Turner

Program Manager

Visual C# Compiler

e

Il seguente elemento di feedback hai inviato a Microsoft Connect è stato aggiornato: Product/Technology - visiva Studio e .NET Framework - Feedback ID - 476133 Titolo feedback - Nested Linq Min() arresta in modo anomalo Visual Studio 200 8 IDE I seguenti campi o valori cambiato: Campo Stato modificata da [Attivo] per [Risolto]

campo Risoluzione modificata da [Nessuno] a [non risolverà]

3

Sono riuscito a ripeterlo durante l'installazione di Visual Studio 2008. Sembra che il servizio linguistico stia colpendo un ciclo infinito e alla fine esaurisca la memoria. Puoi per favore presentare un bug sul sito di connessione?

Connect: http://connect.microsoft.com

Se fate il bug, si prega di aggiungere un commento alla mia risposta con il numero di bug.

+0

Sto lavorando con il poster originale e ho inviato il bug report sotto il mio login: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=476133 – geofftnz

0

Non è nemmeno necessario andare così lontano. VS si è bloccato quando ho digitato la parte d dell'espressione LINQ nidificata.

3

Inferenza di tipo per espressioni lambda nidificate takes exponential time. Quindi non sorprende che il compilatore rallenti quando si fa troppo il nesting.

Tuttavia, l'IDE gestirà idealmente tali casi e interromperà l'inferenza del tipo se la sua durata è troppo lunga.

+1

Ho aggiunto il tuo link etc come commento sul bug report Probabilmente è troppo chiedere alla MS di risolvere un problema NP-Hard, ma la tua idea di timeout è buona. – geofftnz

0

Ho pensato di far notare che congela anche VS 2010, e per di più ha quasi bloccato il mio intero sistema!

1

utilizzando la ricorsione di base invece di cercare di 'indovinare' la profondità, crescente complessità ad ogni livello

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

Come sottolineato da Ryan Versaw, si può anche fare questo senza metodi di estensione in questo modo:

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

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

Questa era la stessa soluzione che ho immediatamente pensato. Vorrei sottolineare che questo metodo di estensione è davvero necessario solo se non si ha il controllo della propria classe di test (o se è usato solo per i test e non avrebbe senso avere come metodo normale). –

0

Penso che ho appena vissuto qualcosa simile. Stavo passando per il mio codice e utilizzando var sulle righe in cui stavo dichiarando e inizializzando le variabili su new SomeClass(). Il mio codice è stato compilato Quando ho provato a eseguire qualsiasi test di unità di Visual Studio 2008, Visual Studio si bloccherebbe con CLR20r3 come nome/tipo di errore. Ripristinando tutte le mie modifiche allo var, i test funzionano correttamente.

Problemi correlati