5

Sono di fronte a un problema nel tentativo di chiamare Compile() sull'espressione Lambda del tipo Espressione < Func < MyType, bool >> che ha una profondità intorno a 400. E valori inferiori non causano alcun problema. E non riesco a trovare nulla su questo tipo di limitazione. Qualcuno può chiarirlo? Posso aumentare questo limite?Limitazioni della profondità dell'albero di espressione

UPD: Siamo spiacenti, dimenticato di dire, mi sto StackOverflowException:

Un'eccezione non gestita di tipo 'System.StackOverflowException' si è verificato in System.Core.dll {Impossibile valutare l'espressione perché il thread corrente è in uno stato di overflow dello stack.}

+2

quali eccezioni ottieni? –

+0

cos'è "un problema"? che succede? a 'StackOverflowException'? o ...? –

+1

Per me questo rientra leggermente nella categoria Raymond Chen [Se devi chiedere, probabilmente stai facendo qualcosa di sbagliato] (http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759 .aspx) – AakashM

risposta

3

Si sta legittimamente correndo un limite per le dimensioni dello stack (sebbene io metta in dubbio la saggezza di un lambda di oltre 400 item). Il modo più semplice per bypassare è creare un nuovo thread appositamente per eseguire questa compilazione con uno stack più grande, utilizzando il costruttore di thread che accetta le dimensioni dello stack come argomento: http://msdn.microsoft.com/en-us/library/ms149581.aspx

Chiama compilare in tale thread e aumentare la dimensione dello stack argomento se necessario. È in byte, credo, che renderebbe l'impostazione predefinita su 1048576, quindi inizia da lì e rilancia se necessario.

+0

Questa soluzione è ora limitata a Full Trust. "A partire da .NET Framework 4, solo il codice completamente affidabile può impostare maxStackSize su un valore maggiore della dimensione dello stack predefinita (1 megabyte). Se viene specificato un valore maggiore per maxStackSize quando il codice è in esecuzione con trust parziale, maxStackSize è ignorato e viene utilizzata la dimensione dello stack predefinita. Non viene generata alcuna eccezione. Il codice a qualsiasi livello di attendibilità può impostare maxStackSize su un valore inferiore alla dimensione dello stack predefinita. " – bentayloruk