ThreadPool.SetMinThreads(Int32, Int32) メソッド

定義

スレッドの作成と破棄を管理するためのアルゴリズムに切り替える前に、新しい要求が行われるとき、スレッド プールが必要に応じて作成するスレッドの最小数を設定します。

public:
 static bool SetMinThreads(int workerThreads, int completionPortThreads);
public static bool SetMinThreads(int workerThreads, int completionPortThreads);
static member SetMinThreads : int * int -> bool
Public Shared Function SetMinThreads (workerThreads As Integer, completionPortThreads As Integer) As Boolean

パラメーター

workerThreads
Int32

スレッド プールがオンデマンドで作成するワーカー スレッドの最小数。

completionPortThreads
Int32

スレッド プールがオンデマンドで作成する非同期 I/O スレッドの最小数。

返品

true 変更が成功した場合。それ以外の場合は false

次の例では、ワーカー スレッドの最小数を 4 に設定し、非同期 I/O 完了スレッドの最小数の元の値を保持します。

using System;
using System.Threading;

public class Test
{
    public static void Main()
    {
        int minWorker, minIOC;
        // Get the current settings.
        ThreadPool.GetMinThreads(out minWorker, out minIOC);
        // Change the minimum number of worker threads to four, but
        // keep the old setting for minimum asynchronous I/O 
        // completion threads.
        if (ThreadPool.SetMinThreads(4, minIOC))
        {
            // The minimum number of threads was set successfully.
        }
        else
        {
            // The minimum number of threads was not changed.
        }
    }
}
Imports System.Threading

Public Class Test

    <MTAThread> _
    Public Shared Sub Main()
        Dim minWorker, minIOC As Integer
        ' Get the current settings.
        ThreadPool.GetMinThreads(minWorker, minIOC)
        ' Change the minimum number of worker threads to four, but
        ' keep the old setting for minimum asynchronous I/O 
        ' completion threads.
        If ThreadPool.SetMinThreads(4, minIOC) Then
            ' The minimum number of threads was set successfully.
        Else
            ' The minimum number of threads was not changed.
        End If
    End Sub
End Class

注釈

Windows スレッド プールが .NET スレッド プールではなく使用されるように構成されている場合、このメソッドはサポートされません。 詳細については、 Windows スレッド プールの構成設定を参照してください。

スレッド プールは、各カテゴリの最小値に達するまで、新しいワーカー スレッドまたは I/O 完了スレッドをオンデマンドで提供します。 最小値に達すると、スレッド プールはそのカテゴリに追加のスレッドを作成するか、一部のタスクが完了するまで待機できます。 .NET Framework 4 以降では、スレッド プールはスループットを最適化するためにスレッドを作成および破棄します。これは、時間単位で完了したタスクの数として定義されます。 使用可能なリソースを最適に使用できないスレッドが少なすぎるのに対し、スレッドの数が多すぎるとリソースの競合が増加する可能性があります。

需要が低い場合、スレッド プール スレッドの実際の数が最小値を下回る可能性があります。

負の数またはアクティブなスレッド プール スレッドの最大数 ( GetMaxThreads を使用して取得) より大きい数を指定した場合、 SetMinThreadsfalse を返し、どちらの最小値も変更しません。

デフォルトでは、スレッドの最小数はプロセッサ数に設定されています。 SetMinThreads を使用して、スレッドの最小数を増やすことができます。たとえば、キューに入れられた作業項目またはタスクがスレッド プール スレッドをブロックする問題を一時的に回避できます。 これらのブロックにより、すべてのワーカーまたはI/O完了スレッドがブロックされる (枯渇) 状況が発生することがあります。 ただし、スレッドの最小数を増やすと、次のような他の方法でパフォーマンスが低下する可能性があります。

  • スレッド プールでは、ワーカー スレッドがブロックされていない場合でも、より多くのワーカー スレッドをスケジュールできます。 オーバーサブスクリプションにより、長いキューで別のタイム スライスが取得されるのを待つと、スケジュールアウトされるスレッドが大幅に遅延し、一部の作業項目またはタスクが遅延する可能性があります。
  • ワーカー スレッドは、作業を盗むためにより多くのスレッドをスキャンする必要があるため、作業項目のデキューに CPU 時間がかかる場合があります。
  • スレッド間でコンテキストを切り替えると、CPU 使用率が増加する可能性があります。
  • スレッド スタックのウォークでは、ガベージ コレクションの CPU 時間が長くなる場合があります。
  • このプロセスでは、より多くのメモリが消費される可能性があります。

Caution

SetMinThreadsメソッドを使用してスレッドの最小数を増やすと、前のテキストで説明したようにパフォーマンスの問題が発生する可能性があります。 ほとんどの場合、スレッド プールは、スレッドを割り当てる独自のアルゴリズムでパフォーマンスが向上します。 最小をプロセッサの数より小さくすると、パフォーマンスが低下する可能性もあります。

適用対象

こちらもご覧ください