Возможно ли в C #, работающем на сервере Windows, создать поток с максимальным размером стека, меньшим 256 КБ?- Или как там по умолчанию для 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);
}