【问题标题】:How to find current thread's max stack size in .net?如何在.net中找到当前线程的最大堆栈大小?
【发布时间】:2012-02-20 04:04:21
【问题描述】:
【问题讨论】:
标签:
c#
.net
multithreading
【解决方案1】:
从 Windows 8 开始,有 GetCurrentThreadStackLimits() 函数。您可以通过 PInvoke 从 C# 中使用它,如下所示:
[DllImport("kernel32.dll")]
static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
uint low;
uint high;
GetCurrentThreadStackLimits(out low, out high);
var size = (high - low) / 1024; // in KB
在我的机器上,这在控制台应用程序中产生 1MB,在 Web 应用程序 (IIS) 中产生 256KB。
【解决方案2】:
获取这些信息实际上是一个真正的 PITA:
- 使用GetCurrentThreadId获取线程ID
- 使用OpenThread 获取线程句柄
- 现在使用NtQueryInformationThread 获取有关线程的信息。您将使用
ThreadBasicInformation 作为THREADINFOCLASS 来获得THREAD_BASIC_INFORMATION 结构。您现在有了TebBaseAddress 参数,它是线程环境块的地址。
- 在
TebBaseAddress 地址处读入进程内存。
- 在线程环境块 (TEB) 中,您可以访问
StackLimit 属性,这是您要查找的值。
从第 3 步开始,它没有记录。这就是为什么我不建议检索此信息。