アプリケーションが対象としている動作環境によって(コンソールなのか GUI なのか)、どのような手段を使って並列処理するべきなのかが異なります。
たとえば .NET 4.5 以上を対象にしたコンソールアプリケーションであれば、Console
の操作にスレッドを意識する必要がないので次のように書くことができます。
lang
1using System;
2using System.Threading.Tasks;
3
4class Program
5{
6 static void Main(string[] args)
7 {
8 // DoSomething が呼び出されるがこの関数は結果を待機せずにそのまま実行される
9 var task = DoSomething();
10 // ユーザー入力を待機する
11 int input = int.Parse(Console.ReadLine());
12 // DoSomething の結果を待機する
13 task.Wait();
14 // 結果は Task.Result に格納されているので入力と足し算して表示
15 Console.WriteLine("実行結果: {0}", task.Result + input);
16 }
17
18 static async Task<int> DoSomething()
19 {
20 // 例)時間のかかる計算をする
21 await Task.Delay(4000);
22 return 5;
23 }
24}
もし作成しているアプリケーションが Windows Forms や WPF の場合は、スレッドコンテキストを意識した作りに変える必要があります。