在Windows服务器上运行的C#中,是否可以创建最大堆栈大小小于256KB的线程? -或IIS的默认值;或者或更具体地说,是 Azure网站。
我写的这个控制台程序似乎表明不可能通过.NET Thread
构造函数,而且我还没有在网上找到任何表明可以通过P-Invoke或任何其他机制实现的信息。
这是我的Windows 10桌面上的程序输出:
默认最大堆栈大小(以字节为单位):1,048,576
预期的最大堆栈大小(以字节为单位):64,000;实际:262,144
预期的最大堆栈大小(以字节为单位):128,000;实际:262,144
预期的最大堆栈大小(以字节为单位):512,000;实际:524,288
预期的最大堆栈大小(以字节为单位):2,048,000;实际:2,097,152
预期的最大堆栈大小(以字节为单位):1,024,000;实际:1,048,576
internal class Program
{
public static void Main()
{
var threads = new[]
{
CreateControlThread(),
CreateThread(64_000),
CreateThread(128_000),
CreateThread(512_000),
CreateThread(1_024_000),
CreateThread(2_048_000)
};
foreach (var thread in threads) thread.Start();
foreach (var thread in threads) thread.Join();
Console.ReadKey();
}
private Thread CreateControlThread()
=> new Thread(() => WriteMaximumStackSize(0));
private static Thread CreateThread(int maximumStackSizeInBytes)
=> new Thread(() => WriteMaximumStackSize(maximumStackSizeInBytes), maximumStackSizeInBytes);
private static void WriteMaximumStackSize(int expected)
{
GetCurrentThreadStackLimits(out uint low, out uint high);
if (expected > 0)
{
Console.WriteLine("Expected maximum stack size in bytes: " + expected.ToString("n0") + "; Actual: " + (high - low).ToString("n0"));
}
else
{
Console.WriteLine("Default maximum stack size in bytes: " + (high - low).ToString("n0"));
}
}
[DllImport("kernel32.dll")]
private static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
}
答案 0 :(得分:0)
看看Thread Stack Size docs on Microsoft.com。
尤其是,默认堆栈大小是在PE标头(EXE文件的标头)中设置的。您可能会找到一种方法来P /调用对可以控制堆栈大小的本机线程创建调用的适当调用,但是我不知道如何将.NET Thread对象附加到这样的本机线程。
我什至无法想象您可以对线程池线程执行此操作。
您可能会四处寻找别人的线程库。可能有一些适合您的需求。我知道我已经成功使用了第三方线程池库(但是我不记得有任何“自带线程”功能)。