C# でのスレッドとタスク
このチュートリアルでは、C# の Thread
クラスと Task
クラスの類似点と相違点について説明します。
C# のスレッド
Thread
クラスは、C# で実際のオペレーティングシステムレベルのスレッドを作成します。Thread
クラスで作成されたスレッドは、スタックのメモリなどのリソースを使用し、コンテキストの CPU オーバーヘッドはあるスレッドから別のスレッドに切り替わります。Thread
クラスは、Abort()
関数、Suspend()
関数、Resume()
関数などの高度な制御を提供します。スタックサイズなどのスレッドレベルの属性を指定することもできます。次のコード例は、C# で Thread
クラスを使用してスレッドを作成する方法を示しています。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace wait_for_thread {
class Program {
static void fun1() {
for (int i = 0; i < 2; i++) {
Console.WriteLine("Thread 1");
}
}
static void fun2() {
for (int i = 0; i < 2; i++) {
Console.WriteLine("Thread 2");
}
}
static void Main(string[] args) {
Thread thread1 = new Thread(new ThreadStart(fun1));
Thread thread2 = new Thread(new ThreadStart(fun2));
thread1.Start();
thread2.Start();
Console.WriteLine("The End");
}
}
}
出力:
The End
Thread 2
Thread 2
Thread 1
Thread 1
上記のコードでは、C# の Thread
クラスを使用してスレッド thread1
と thread2
を作成しました。
C# のタスク
Task
クラスは、C# で非同期のシステムレベルのタスクを作成します。タスクスケジューラは、Task
クラスで作成されたタスクを実行します。デフォルトのスケジューラーは、スレッドプール内でタスクを実行します。Thread
クラスで作成されたスレッドとは異なり、Task
クラスで作成されたタスクは、追加のメモリや CPU リソースを必要としません。Task
クラスを使用して、スタックサイズなどのスレッドレベルの属性を指定することはできません。Task
クラスはスレッドプールで実行されるため、長時間実行されるタスクはスレッドプールをいっぱいにする可能性があり、新しいタスクは前のタスクの実行が完了するのを待つことになります。次のコード例は、C# で Task
クラスを使用してタスクを作成する方法を示しています。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace wait_for_thread {
class Program {
static void fun1() {
for (int i = 0; i < 2; i++) {
Console.WriteLine("Thread 1");
}
}
static void fun2() {
for (int i = 0; i < 2; i++) {
Console.WriteLine("Thread 2");
}
}
static void Main(string[] args) {
Task task1 = Task.Factory.StartNew(() => fun1());
Task task2 = Task.Factory.StartNew(() => fun2());
Task.WaitAll(task1, task2);
Console.WriteLine("The End");
}
}
}
出力:
Thread 1
Thread 1
Thread 2
Thread 2
The End
上記のコードでは、C# の Task
クラスを使用してタスク task1
と task2
を作成しました。
C# でのスレッドとタスク
Thread
クラスと Task
クラスの両方が、C# での並列プログラミングに使用されます。スレッドは低レベルの実装であり、タスク
は高レベルの実装です。タスク
ではなく、リソースを必要とします。また、タスククラスよりも詳細な制御を提供します。長時間実行される操作にはスレッドが優先され、その他の非同期操作にはタスクが優先されます。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn