5

Tengo un problema al intentar llamar a Compile() en el LambdaExpression del tipo Expresión < Func < MyType, bool >> que tiene una profundidad alrededor de 400. Y valores menores no causan ningún problema. Y no puedo encontrar nada sobre ese tipo de limitación. ¿Alguien puede aclarar esto? ¿Puedo aumentar este límite?Limitaciones de profundidad del árbol de expresiones

UPD: Lo sentimos, se olvidó de mencionar, me estoy poniendo StackOverflowException:

Una excepción no controlada del tipo 'System.StackOverflowException' producido en System.Core.dll {No se puede evaluar la expresión debido a que el hilo actual está en un estado de desbordamiento de pila.}

+2

¿Qué excepciones obtienes? –

+0

¿qué es "un problema"? ¿lo que pasa? una 'StackOverflowException'? o ...? –

+1

Para mí, esto cae un poco en la categoría de Raymond Chen [Si tiene que preguntar, probablemente esté haciendo algo mal] (http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759 .aspx) – AakashM

Respuesta

3

Está legítimamente corriendo hacia un límite en el tamaño de la pila (aunque cuestiono la sabiduría de un lambda de más de 400 elementos). La forma más sencilla de eludir eso es crear un nuevo subproceso específicamente para realizar esta compilación con una pila más grande, utilizando el constructor de subprocesos que toma el tamaño de la pila como argumento: http://msdn.microsoft.com/en-us/library/ms149581.aspx

Call compile en ese subproceso y aumenta el tamaño de pila argumento según sea necesario. Está en bytes, creo, lo que haría que el valor predeterminado sea 1048576, así que comience allí y críelo según sea necesario.

+0

Esta solución ahora está limitada a la confianza total. "A partir de .NET Framework 4, solo el código completamente confiable puede establecer maxStackSize a un valor que es mayor que el tamaño de pila predeterminado (1 megabyte). Si se especifica un valor mayor para maxStackSize cuando el código se ejecuta con confianza parcial, maxStackSize es se ignora y se usa el tamaño de pila predeterminado. No se lanza ninguna excepción. El código en cualquier nivel de confianza puede establecer maxStackSize en un valor que es menor que el tamaño de pila predeterminado ". – bentayloruk

Cuestiones relacionadas