マルチスレッドを使用すると、アプリケーションの応答性を高め、アプリケーションがマルチプロセッサまたはマルチコア システムで実行される場合は、そのスループットを向上させることができます。
プロセスとスレッド
プロセスは実行中のプログラムです。 オペレーティング システムは、プロセスを使用して、実行中のアプリケーションを分離します。 スレッドは、オペレーティング システムがプロセッサ時間を割り当てる基本的な単位です。 各スレッドには スケジュール設定の優先順位 があり、スレッドの実行が一時停止されたときにスレッド コンテキストを保存するためにシステムが使用する一連の構造体が保持されます。 スレッド コンテキストには、スレッドの CPU レジスタとスタックのセットを含め、スレッドがシームレスに実行を再開するために必要なすべての情報が含まれます。 プロセスのコンテキストで複数のスレッドを実行できます。 プロセスのすべてのスレッドは、その仮想アドレス空間を共有します。 スレッドは、現在別のスレッドによって実行されている部分を含め、プログラム コードの任意の部分を実行できます。
注
.NET Framework には、アプリケーション ドメインを使用してプロセス内でアプリケーションを分離 する方法が用意されています。 (アプリケーション ドメインは .NET Core では使用できません)。)詳細については、アプリケーション ドメインに関する記事の「アプリケーション ドメインとスレッド」セクションを参照してください。
既定では、.NET プログラムは、プライマリ スレッドと呼ばれる 1 つのスレッドで 開始されます。 ただし、コードを並列またはプライマリ スレッドと同時に実行する追加のスレッドを作成できます。 これらのスレッドは、多くの場合、 ワーカー スレッドと呼ばれます。
複数のスレッドを使用する場合
複数のスレッドを使用して、アプリケーションの応答性を高め、マルチプロセッサまたはマルチコア システムを利用してアプリケーションのスループットを向上させます。
プライマリ スレッドがユーザー インターフェイス要素を担当し、ユーザー アクションに応答するデスクトップ アプリケーションについて考えます。 ワーカー スレッドを使用して時間のかかる操作を実行します。そうしないと、プライマリ スレッドが占有され、ユーザー インターフェイスが応答しなくなります。 また、ネットワークまたはデバイスの通信に専用のスレッドを使用して、受信メッセージやイベントに対する応答性を高めることもできます。
プログラムが並列で実行できる操作を実行する場合、それらの操作を個別のスレッドで実行し、マルチプロセッサまたはマルチコア システムでプログラムを実行することで、合計実行時間を短縮できます。 このようなシステムでは、マルチスレッドを使用すると、スループットが向上し、応答性が向上する可能性があります。
.NET でマルチスレッドを使用する方法
.NET Framework 4 以降では、マルチスレッドを使用する推奨される方法は、 タスク並列ライブラリ (TPL) と Parallel LINQ (PLINQ) を使用することです。 詳細については、「 並列プログラミング」を参照してください。
TPL と PLINQ はどちらも、 ThreadPool スレッドに依存します。 System.Threading.ThreadPool クラスは、.NET アプリケーションにワーカー スレッドのプールを提供します。 スレッド プールのスレッドを使用することもできます。 詳細については、「 マネージド スレッド プール」を参照してください。
最後に、マネージド スレッドを表す System.Threading.Thread クラスを使用できます。 詳細については、「 スレッドとスレッドの使用」を参照してください。
複数のスレッドが共有リソースにアクセスする必要がある場合があります。 リソースを破損していない状態に保ち、競合状態を回避するには、リソースへのスレッド アクセスを同期する必要があります。 また、複数のスレッドの相互作用を調整することもできます。 .NET には、共有リソースへのアクセスの同期やスレッド操作の調整に使用できるさまざまな種類が用意されています。 詳細については、「 同期プリミティブの概要」を参照してください。
スレッド内の例外を処理します。 スレッド内のハンドルされない例外は、通常、プロセスを終了します。 詳細については、「 マネージド スレッドでの例外」を参照してください。
こちらも参照ください
.NET