回答:
固有の制限はありません。スレッドの最大数は、使用可能な物理リソースの量によって決まります。詳細については、Raymond Chenによるこの記事を参照してください。
スレッドの最大数を尋ねる必要がある場合は、おそらく何か問題があります。
[ 更新:ちょうど興味がない:.NETスレッドプールのデフォルトのスレッド数:
(これらの数値はハードウェアとOSによって異なる場合があります)]
ミッチは正しいです。リソース(メモリ)に依存します。
Raymondの記事はC#スレッドではなくWindowsスレッドに特化していますが、ロジックは同じです(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の例外(もちろんメモリ不足)にブレークポイントを設定して、counterの値を確認します。もちろん、非常に大きな違いがあります。
C#を介したCLRのJeff Richter:
「バージョン2.0のCLRでは、ワーカースレッドの最大数はデフォルトでマシンのCPUあたり25になり、I / Oスレッドの最大数はデフォルトで1000になります。1000の制限は事実上まったく制限なしです。」
これは.NET 2.0に基づいていることに注意してください。これは.NET 3.5で変更された可能性があります。
[編集] @Mitchが指摘したように、これはCLR ThreadPoolに固有のものです。スレッドを作成している場合は、@ Mitchなどのコメントを直接参照してください。
次のコードを使用してテストできます。
private static void Main(string[] args)
{
int threadCount = 0;
try
{
for (int i = 0; i < int.MaxValue; i ++)
{
new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
threadCount ++;
}
}
catch
{
Console.WriteLine(threadCount);
Console.ReadKey(true);
}
}
アプリケーションの32ビットおよび64ビットモードに注意してください。
デバッグでThreadPool.GetMaxThreadsメソッドを実行することをお勧めします
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
ドキュメントと例:https : //docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8