に関してThreadPool.RegisterWaitForSingleObject
は、これは登録ごとに (プールされているかどうかに関係なく) スレッドを拘束しません。これは簡単にテストできます。LINQPad で次のスクリプトを実行して、そのメソッドを 20,000 回呼び出します。
static ManualResetEvent _starter = new ManualResetEvent (false);
void Main()
{
var regs = Enumerable.Range (0, 20000)
.Select (_ => ThreadPool.RegisterWaitForSingleObject (_starter, Go, "Some Data", -1, true))
.ToArray();
Thread.Sleep (5000);
Console.WriteLine ("Signaling worker...");
_starter.Set();
Console.ReadLine();
foreach (var reg in regs) reg.Unregister (_starter);
}
public static void Go (object data, bool timedOut)
{
Console.WriteLine ("Started - " + data);
// Perform task...
}
そのコードが 5 秒間の「待機」中に 20,000 のスレッドを拘束した場合、おそらく機能しません。
編集- への応答:
「これは証拠です。しかし、シグナルのみをチェックする単一のスレッドがスレッドプールにまだありますか?」
これは実装の詳細です。はい、コールバックをマネージ スレッド プールにオフロードする単一のスレッドで実装できますが、これが保証されるわけではありません。待機ハンドルは、最終的にはオペレーティング システムによって管理されます。これにより、コールバックもトリガーされる可能性が高くなります。内部実装で 1 つのスレッド (または少数のスレッド) を使用する場合があります。または、割り込みを使用すると、単一のスレッドをブロックしない場合があります。オペレーティング システムのバージョンによっても異なる場合があります。これは、実際には関係のない実装の詳細です。