アップした以前の記事は以下からご参照くださいませ。
- タスク並列ライブラリ(TPL)についてのリソース (Task Parallel Library, Parallel.For, Thread, ThreadPool, 非同期, 並列)
- タスク並列ライブラリ入門記-000 (事始め, 殴り書きメモ)
- タスク並列ライブラリ入門記-001 (タスクの実行, TPL, Task.Factory.StartNew, Wait, WaitAll)
- タスク並列ライブラリ入門記-002 (タスクの実行, TPL, Task.ctor, Wait, WaitAll)
- タスク並列ライブラリ入門記-003 (タスクの入れ子, デタッチされた入れ子のタスク, 親のタスクとの関連を持たない, TaskCreationOptions.None)
今回は、タスクの入れ子についてのサンプル。
タスクの入れ子パターンは、2種類ありますが今回はアタッチされた入れ子のサンプルです。
#region TaskSamples-04 /// <summary> /// タスク並列ライブラリについてのサンプルです。 /// </summary> /// <remarks> /// タスク並列ライブラリは、.NET 4.0から追加されたライブラリです。 /// </remarks> public class TaskSamples04 : IExecutable { public void Execute() { // // 入れ子タスクの作成 // // タスクは入れ子にすることも可能。 // // 入れ子のタスクには、以下の2種類が存在する。 // ・単純な入れ子タスク(デタッチされた入れ子タスク) // ・子タスク(親のタスクにアタッチされた入れ子タスク) // // 以下のサンプルでは、子タスクを作成して実行している。 // 子タスクとは、単純な入れ子タスクと違い、親タスクと親子関係を // 持った状態でタスク処理が行われる。 // // つまり、親のタスクは子のタスクの終了を待ってから、自身の処理を終了する。 // // 親との関連を持つ入れ子のタスクは、「アタッチされた入れ子のタスク」と言う。 // // アタッチされた入れ子タスクの作成は、タスクを生成する際に以下のTaskCreationOptionsを // 指定する。 // TaskCreationOptions.AttachedToParent // // // 親子関係を持つ子タスクを作成. // Console.WriteLine("親のタスク開始"); Task t = new Task(ParentTaskProc); t.Start(); t.Wait(); Console.WriteLine("親のタスク終了"); } void ParentTaskProc() { PrintTaskId(); // // 明示的にTaskCreationOptionsを指定して // アタッチされた入れ子タスクを指定する。 // Task childTask = new Task(ChildTaskProc, TaskCreationOptions.AttachedToParent); childTask.Start(); // // 「デタッチされた入れ子タスク」と違い、親タスクにアタッチされた入れ子タスクは // 明示的にWaitをしなくても、親のタスクが子のタスクの終了を待ってくれる。 // } void ChildTaskProc() { Console.WriteLine("子のタスク開始"); PrintTaskId(); Thread.Sleep(TimeSpan.FromSeconds(2.0)); Console.WriteLine("子のタスク終了"); } void PrintTaskId() { // // 現在実行中のタスクのIDを表示. // Console.WriteLine("\tTask Id: {0}", Task.CurrentId); } } #endregion
実行結果は、以下のようになります。
親のタスク開始 Task Id: 1 子のタスク開始 Task Id: 2 子のタスク終了 親のタスク終了
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ