C#におけるTaskの使い方とは?実行結果の取得方法・待ち合わせ方法

- システム
エンジニア - C#ではTaskで何ができるのですか。
- プロジェクト
マネージャー - 時間のかかる処理を非同期にして並列で処理することができます。
C#におけるTaskの使い方とは?
今回は、C#におけるTaskの使い方について説明します。
Taskを利用すると、非同期処理を実現できます。時間のかかる処理を非同期にして並列で処理できる仕組みです。
Taskの基本的な使い方から、実行結果の取得方法、待ち合わせ方法を紹介します。
C#におけるTaskの使い方に興味のある方はぜひご覧ください。
基本的な使い方
C#におけるTaskの基本的な使い方を紹介します。
実際のソースコードを見てみましょう。
ここでは、時間のかかる処理をThread.Sleepメソッドと仮定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main() { // Taskの実行 Task task1 = Task.Run(() => { Console.WriteLine("task1開始"); Thread.Sleep(5000); Console.WriteLine("task1終了"); }); // Taskの実行 Task task2 = Task.Run(() => { Console.WriteLine("task2開始"); Thread.Sleep(3000); Console.WriteLine("task2終了"); }); Console.ReadLine(); } } } |
実行結果は以下のようになります。
1 2 3 4 |
task1開始 task2開始 task2終了 task1終了 |
task1とtask2が並列で動作していることが分かります。
結果を取得する
C#のTaskで、実行結果を取得する方法を紹介します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main() { // Taskの実行 Task<string> task1 = Task.Run(() => { return SomeMethod(5000); }); // 結果の取得 // SomeMethodが終わるまで待機する string result = task1.Result; Console.WriteLine(result); Console.ReadLine(); } static string SomeMethod(int millisec) { Console.WriteLine("SomeMethod " + millisec + " 開始"); Thread.Sleep(millisec); return "SomeMethod " + millisec + " 終了"; } } } |
実行結果は以下のようになります。
1 2 |
SomeMethod 5000 開始 SomeMethod 5000 終了 |
SomeMethodの戻り値がstringなので、”Task
実行結果を”task1.Result”で取得します。
Resultは、SomeMethodが終わるまで待機していることが分かります。
このように、C#のTaskでは、実行結果を取得できます。
非同期処理の終了待ち合わせ(wait)
C#のTaskでは、waitメソッドで非同期処理の終了待ち合わせができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main() { // Taskの実行 Task task1 = Task.Run(() => { SomeMethod(5000); }); // task1が終わるまで待機 task1.Wait(); Console.WriteLine("Main終了"); Console.ReadLine(); } static void SomeMethod(int millisec) { Console.WriteLine("SomeMethod " + millisec + " 開始"); Thread.Sleep(millisec); Console.WriteLine("SomeMethod " + millisec + " 終了"); } } } |
実行結果は以下のようになります。
1 2 3 |
SomeMethod 5000 開始 SomeMethod 5000 終了 Main終了 |
Waitメソッドでtask1が終了するまで待機していることが分かります。
このように、C#のTaskで非同期処理の終了待ち合わせができます。
非同期処理の終了待ち合わせ(WhenAll)
C#のTaskでは、WhenAllメソッドで複数の非同期処理の終了待ち合わせができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static async Task Main() { // Taskの実行 Task task1 = Task.Run(() => { SomeMethod(5000); }); // Taskの実行 Task task2 = Task.Run(() => { SomeMethod(3000); }); // task1, task2が終わるまで待機 await Task.WhenAll(task1, task2); Console.WriteLine("Main終了"); Console.ReadLine(); } static void SomeMethod(int millisec) { Console.WriteLine("SomeMethod " + millisec + " 開始"); Thread.Sleep(millisec); Console.WriteLine("SomeMethod " + millisec + " 終了"); } } } |
実行結果は以下のようになります。
1 2 3 4 5 |
SomeMethod 5000 開始 SomeMethod 3000 開始 SomeMethod 3000 終了 SomeMethod 5000 終了 Main終了 |
WhenAllメソッドでtask1, task2の両方が終わるまで待機していることが分かります。
このように、C#のTaskではWhenAllメソッドで複数の非同期処理の終了待ち合わせができます。
非同期処理の終了待ち合わせ(WhenAny)
C#のTaskでは、WhenAnyメソッドで複数の非同期処理のうちのいずれか一つの終了待ち合わせができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static async Task Main() { // Taskの実行 Task task1 = Task.Run(() => { SomeMethod(5000); }); // Taskの実行 Task task2 = Task.Run(() => { SomeMethod(3000); }); // task1, task2が終わるまで待機 await Task.WhenAny(task1, task2); Console.WriteLine("Main終了"); Console.ReadLine(); } static void SomeMethod(int millisec) { Console.WriteLine("SomeMethod " + millisec + " 開始"); Thread.Sleep(millisec); Console.WriteLine("SomeMethod " + millisec + " 終了"); } } } |
実行結果は以下のようになります。
1 2 3 4 5 |
SomeMethod 3000 開始 SomeMethod 5000 開始 SomeMethod 3000 終了 Main終了 SomeMethod 5000 終了 |
WhenAnyメソッドでtask1, task2のどちらかが終わるまで待機していることが分かります。
このように、C#のTaskではWhenAnyメソッドで複数の非同期処理のうちのいずれか一つの終了待ち合わせができます。
非同期処理の終了状態を取得する
C#のTaskでは、非同期処理の終了状態を取得できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static async Task Main() { // Taskの実行 Task task1 = Task.Run(() => { SomeMethod(5000); }); // Taskの実行 Task task2 = Task.Run(() => { SomeMethod(3000); }); // task1, task2が終わるまで待機 await Task.WhenAny(task1, task2); // task1の完了チェック if(task1.IsCompleted) { Console.WriteLine("task1は終了しています"); } else { Console.WriteLine("task1は終了していません"); } // task2の完了チェック if (task2.IsCompleted) { Console.WriteLine("task2は終了しています"); } else { Console.WriteLine("task2は終了していません"); } Console.WriteLine("Main終了"); Console.ReadLine(); } static void SomeMethod(int millisec) { Console.WriteLine("SomeMethod " + millisec + " 開始"); Thread.Sleep(millisec); Console.WriteLine("SomeMethod " + millisec + " 終了"); } } } |
実行結果は以下のようになります。
1 2 3 4 5 6 7 |
SomeMethod 5000 開始 SomeMethod 3000 開始 SomeMethod 3000 終了 task1は終了していません task2は終了しています Main終了 SomeMethod 5000 終了 |
WhenAnyメソッドで待ち合わせた後に、taskの終了状態を取得しています。
- システム
エンジニア - Taskを使って実行結果の取得方法や待ち合わせ方法についてよくわかりました。
- プロジェクト
マネージャー - Threadではなくても、Taskでも非同期処理が実現できことを覚えておきましょう。
まとめ
いかがでしたでしょうか。C#におけるTaskの使い方について説明しました。
Taskを利用すると、非同期処理を実現できます。Taskの基本的な使い方から、実行結果の取得方法、待ち合わせ方法を紹介しました。
ぜひご自身でソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)