【问题标题】:Expression tree depth limitations表达式树深度限制
【发布时间】:2012-05-25 14:27:17
【问题描述】:

我在尝试对具有大约 400 深度的 Expression> 类型的 LambdaExpression 调用 Compile() 时遇到问题。较小的值不会导致任何问题。而且我找不到任何关于这种限制的信息。任何人都可以澄清这一点吗?我可以提高这个限制吗?

更新: 抱歉,忘了提,我收到了 StackOverflowException:

System.Core.dll 中出现“System.StackOverflowException”类型的未处理异常 {无法计算表达式,因为当前线程处于堆栈溢出状态。}

【问题讨论】:

  • 什么是“问题”?发生什么了? StackOverflowException?还是...?
  • 对我来说,这略微属于 Raymond Chen 类别If you have to ask, you're probably doing something wrong
  • @AakashM 感谢另一个管理员书签 :) 同意 100%
  • 是的,我也完全同意 :) 而且我确信有办法在我的情况下优化表达式树并降低深度,我现在正在努力做到这一点。尽管如此,了解这种行为背后的真正原因还是很有趣的。所以,克里斯,谢谢你;)

标签: c# delegates expression expression-trees anonymous-function


【解决方案1】:

您合法地遇到了堆栈大小的限制(尽管我质疑 400 多个项目的 lambda 是否明智)。绕过它的最简单方法是创建一个新线程,专门用于使用更大的堆栈执行此编译,使用将堆栈大小作为参数的线程构造函数:http://msdn.microsoft.com/en-us/library/ms149581.aspx

在该线程中调用 compile 并根据需要增加堆栈大小参数。我相信它以字节为单位,这将使默认值约为 1048576,因此从那里开始并根据需要提高它。

【讨论】:

  • 此解决方案现在仅限于完全信任。 “从 .NET Framework 4 开始,只有完全受信任的代码才能将 maxStackSize 设置为大于默认堆栈大小(1 兆字节)的值。如果在以部分信任运行代码时为 maxStackSize 指定更大的值,则 maxStackSize 为忽略并使用默认堆栈大小。不引发异常。任何信任级别的代码都可以将 maxStackSize 设置为小于默认堆栈大小的值。"
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多