C#アプリケーションで作成できるスレッドの最大数はいくつですか?そして、この制限に達するとどうなりますか?何らかの例外がスローされますか?
固有の制限はありません。スレッドの最大数は、使用可能な物理リソースの量によって決まります。詳細については、こちらをご覧ください Raymond Chenによる記事 詳細.
スレッドの最大数を尋ねる必要がある場合は、おそらく何か間違ったことをしている可能性があります。
[Update:興味がない:.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#コンソールを備えた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および他のコメントを直接参照してください。