【C#】別Thread(並列処理、非同期)って何よ
別Thread(並列処理、非同期)
C#では、別のThreadで処理を行う事で並列処理、非同期処理を行う事ができます。
簡単に言えば、処理を同時に複数個行う事ができるという事です。
以下に例を挙げてみましょう。
- 新しいプロジェクトの作成
- コンソールアプリ(.NET Framework)
- 作成
ここにこんな感じで書いてみましょう。
2つの処理があって、それぞれ、1~1000を足す処理と、1~100を足す処理です。
static void Main(string[] args) { var res1 = Sum1(); var res2 = Sum2(); Console.Read(); } static int Sum1() { Console.WriteLine("計算1開始"); var sum = 0; for (int i = 1; i <= 1000; i++){ sum = sum + i; } System.Threading.Thread.Sleep(1000); Console.WriteLine("計算1合計=" + sum); return sum; } static int Sum2() { Console.WriteLine("計算2開始"); var sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } System.Threading.Thread.Sleep(500); Console.WriteLine("計算2合計=" + sum); return sum; }
これを実行すると、以下のように表示されます。
計算1開始 計算1合計=500500 計算2開始 計算2合計=5050
では、これをそれぞれ別Threadで処理してみましょう。
static void Main(string[] args) { int res1, res2; var t1 = new System.Threading.Thread(() => { res1 = Sum1(); }); var t2 = new System.Threading.Thread(() => { res2 = Sum2(); }); t1.Start(); t2.Start(); Console.Read(); } static int Sum1() { Console.WriteLine("計算1開始"); var sum = 0; for (int i = 1; i <= 1000; i++){ sum = sum + i; } System.Threading.Thread.Sleep(1000); Console.WriteLine("計算1合計=" + sum); return sum; } static int Sum2() { Console.WriteLine("計算2開始"); var sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } System.Threading.Thread.Sleep(500); Console.WriteLine("計算2合計=" + sum); return sum; }
結果はおそらく、以下のように表示されると思われます。
これが何を意味するのかというと、計算1と計算2がほぼ同時に実行され、結果は、計算2の方が早く計算されるという事です。
こういう風に処理を並列で行う事を別Threadで処理するとか、並列処理とか非同期処理とか言ったりします。(BackgroundWorkerも別Threadで処理してくれる頼もしいやつです)
計算1開始 計算2開始 計算2合計=5050 計算1合計=500500
ThreadとTask
Threadでももちろん良いのですが、ナウなヤング達はTaskを使って非同期処理を行います。
Taskを使うといろいろなことがスマートに書くことができます。(俺もよくわかってないのでここでは触れませんが)
結果はThreadのときと同じです。
static void Main(string[] args) { int res1, res2; var t1 = Task.Run(() => { return Sum1(); }); var t2 = Task.Run(() => { return Sum2(); }); res1 = t1.Result; res2 = t2.Result; Console.Read(); } static int Sum1() { Console.WriteLine("計算1開始"); var sum = 0; for (int i = 1; i <= 1000; i++){ sum = sum + i; } System.Threading.Thread.Sleep(1000); Console.WriteLine("計算1合計=" + sum); return sum; } static int Sum2() { Console.WriteLine("計算2開始"); var sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } System.Threading.Thread.Sleep(500); Console.WriteLine("計算2合計=" + sum); return sum; }