Митч прав. Это зависит от ресурсов (памяти).
Хотя статья Рэймонда посвящена потокам Windows, а не потокам C #, логика применяется аналогично (потоки C # отображаются на потоки Windows).
Однако, поскольку мы находимся в C #, если мы хотим быть абсолютно точными, нам нужно различать «запущенные» и «незапущенные» потоки. Только запущенные потоки фактически резервируют пространство стека (как мы могли ожидать). Незапущенные потоки выделяют только информацию, требуемую для объекта потока (вы можете использовать отражатель, если заинтересованы в реальных членах).
Вы можете проверить это сами, сравните:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
newThread.Start();
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
с:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
Поставьте точку останова в исключении (конечно, нехватке памяти) в VS, чтобы увидеть значение счетчика. Разница, конечно, очень существенная.