ボタン押下時の処理にて、以下のような要件を想定したサンプルです。
(.NET Framework4.5.1利用)
開始
↓
A処理
↓ ↓
B処理 C処理 ※
↓ ↓
D処理
↓
終了
※ここだけ並行処理可能なので、マルチスレッド化したい。
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using System.Threading.Tasks; using System.Windows.Forms; namespace AsyncSample { /// /// async/awaitの利用サンプル /// public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// /// ボタン押下時に並行実行可能な処理をマルチスレッドで実行する /// ※private void → private async void に変更 /// /// /// private async void button1_Click(object sender, EventArgs e) { Console.WriteLine("最初に行う処理。これが終わるまではMainSampleは呼び出されない。"); //マルチスレッド処理(awaitを付けて、メソッド内の処理が終わるのを待っている) await MainSample(); Console.WriteLine("最後に行う処理。MainSampleが終わった後に呼び出される。"); } /// /// 並行実行可能な処理 /// ※private void → private async Task に変更 /// /// private async Task MainSample() { //task1の実行を開始 Task<string> task1 = Dummy(5, "task1"); //task2の実行を開始 Task<string> task2 = Dummy(1, "task2"); //task1とtask2の実行が終わるまで待つ await task1; await task2; //それぞれのtaskの戻り値を取得 Console.WriteLine("task1の戻り値:" + task1.Result); Console.WriteLine("task2の戻り値:" + task2.Result); } /// /// 複数の引数を受け取り、処理結果を戻り値として返す /// ※private void → private async Task /// /// /// /// private async Task<string> Dummy(int i, string s) { Console.WriteLine("処理開始:" + i); string dummyText = await Task.Run(() => { //何らかの重い処理・・・ System.Threading.Thread.Sleep(1000 * i); return s + "の処理完了:" + DateTime.Now.ToString(); }); Console.WriteLine("処理完了:" + i); return dummyText; } } } |
実行結果>
最初に行う処理。これが終わるまではMainSampleは呼び出されない。
処理開始:5
処理開始:1
処理完了:1
処理完了:5
task1の戻り値:task1の処理完了:2017/02/18 0:15:32
task2の戻り値:task2の処理完了:2017/02/18 0:15:28
最後に行う処理。MainSampleが終わった後に呼び出される。