C#アプリケーションで作成できるスレッドの最大数はいくつですか?そしてこの限界に達するとどうなりますか?ある種の例外がスローされますか?
本質的な制限はありません。最大スレッド数は、利用可能な物理リソースの量によって決まります。これを見てRaymond Chenによる記事詳細については。
最大スレッド数を尋ねる必要がある場合は、おそらく何か問題があります。
[更新:おもしろいことに:.NET Thread Poolのデフォルトのスレッド数:
(これらの数字は、ハードウェアと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)
{
}
}
counterの値を確認するには、VSの例外(もちろんメモリ不足)にブレークポイントを設定します。もちろん、非常に大きな違いがあります。
私はC#コンソールで64ビットシステム上でテストを行った、例外は2949スレッドを使用して、メモリ不足のタイプです。
私はスレッドプールを使用するべきだと認識していますが、これは主な質問に対する回答です。
システムが実行するスレッド数を決定できるように、スレッドプール(または非同期デリゲート、つまりスレッドプールを使用する)を使用する必要があります。
C#によるCLRのJeff Richter:
"CLRのバージョン2.0では、最大数 ワーカースレッド数のデフォルトは、マシンのCPUごとに25 最大I / O数 スレッドのデフォルトは1000です。1000の制限は事実上まったく制限がありません。」
これは.NET 2.0に基づいています。これは.NET 3.5で変更された可能性があります。
[編集] @Mitchが指摘したように、これはCLR ThreadPoolに固有のものです。スレッドを直接作成している場合は、@ Mitchや他の人のコメントを参照してください。