增加主程序的堆栈大小或为递归代码块创建具有更大堆栈大小的新线程?

Increase stack size of main program or create a new thread with larger stack size for recursive code blocks?

我有一个跟进问题

我是否应该使用以下 post 构建事件来增加主程序的堆栈大小:

"$(DevEnvDir)..\..\VC\bin\editbin.exe" /STACK:8388608 "$(TargetPath)"

或者我应该将我的递归代码块封装在一个具有更大堆栈大小的新线程中吗?

Thread thread = new Thread(delegate()
{
    // do work with larger stack size
}, 8192 * 1024);
thread.Start();
thread.Join();

具有大量递归的代码来自 Intel MKLs LAPACKE_dtrtri 函数,我调用了 DLLImport。所以我无法更改此代码。我可以更改堆栈大小以避免堆栈溢出错误。

注意:对于我 99% 的应用程序,4 MB(64 位)的默认堆栈大小就足够了,但另外 1% 使用的是高度递归的外部代码。

  • Which solution is the better one?
  • Which solution is the better one?

在 post-build 事件中使用 editbin 的第一种方法 在使用强名称密钥对程序集签名时失败。使用 editbin 更改程序集后,签名程序集的验证将失败。 sn.exe -v assembly.exe 将 return Failed to verify assembly -- Strong name validation failed ...

另见:

使用 AfterCompile 事件并退出程序集是一种解决方法(我现在正在使用)。项目文件应包含以下行:

  <Target Name="AfterCompile">
    <Exec Command="
&quot;$(DevEnvDir)..\..\VC\bin\editbin.exe&quot; /STACK:16777216 &quot;$(ProjectDir)obj$(ConfigurationName)$(TargetFileName)&quot;
&quot;$(FrameworkSDKDir)bin\NETFX 4.5.1 Tools\sn.exe&quot; -Ra &quot;$(ProjectDir)obj$(ConfigurationName)$(TargetFileName)&quot; &quot;$(SolutionDir)\STRONGNAME.snk&quot;
" />
  </Target>
  <PropertyGroup>
    <PostBuildEvent>REM "See AfterCompile for stack size and resigning"</PostBuildEvent>
  </PropertyGroup>

当我阅读以下答案时,我意识到了编译后事件:

第二种方法但是对于 hole 程序而不只是对于递归代码块来说看起来像这样:

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Thread thread = new Thread(delegate()
        {
            Main2(args);
        }, 16 * 1024 * 1024);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
    }

    static void Main2(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(app);
    }
}

第二种方法的缺点是 BackgroundWorker DoWork 事件的堆栈大小仍然是 1 MB(32 位或任何)或 4 MB(64 位)。

另见:

  • What is the draw back of creating a new thread with a larger stack size for this calculation?
  • What would be a reasonable stack size?

查看 Hans Passant 的评论。