C# でのスレッドとタスク

Muhammad Maisam Abbas 2023年1月30日 2021年5月9日
  1. C# のスレッド
  2. C# のタスク
  3. C# でのスレッドとタスク
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 クラスを使用してスレッド thread1thread2 を作成しました。

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 クラスを使用してタスク task1task2 を作成しました。

C# でのスレッドとタスク

Thread クラスと Task クラスの両方が、C# での並列プログラミングに使用されます。スレッドは低レベルの実装であり、タスクは高レベルの実装です。タスクではなく、リソースを必要とします。また、タスククラスよりも詳細な制御を提供します。長時間実行される操作にはスレッドが優先され、その他の非同期操作にはタスクが優先されます。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

関連記事 - Csharp Thread