だいぶ前に、TPLについてのメモ書きを書いたままサンプルすらも放置してたのを
今日思い出しまして、今更ながらそのサンプル達をアップ・・・。もうasyncとかawaitな事になってるのに。
アップした以前の記事は以下からご参照くださいませ。
- タスク並列ライブラリ(TPL)についてのリソース (Task Parallel Library, Parallel.For, Thread, ThreadPool, 非同期, 並列)
- タスク並列ライブラリ入門記-000 (事始め, 殴り書きメモ)
- タスク並列ライブラリ入門記-001 (タスクの実行, TPL, Task.Factory.StartNew, Wait, WaitAll)
今回も、タスクの実行についての簡単なサンプル。
内容としては前回と同じで、Factory経由ではなく直接Taskを生成して実行.
#region TaskSamples-02 /// <summary> /// タスク並列ライブラリについてのサンプルです。 /// </summary> /// <remarks> /// タスク並列ライブラリは4.0から追加されたライブラリです。 /// </remarks> public class TaskSamples02 : IExecutable { public void Execute() { // // タスクを直接Newして実行. // // タスクは直接Newして実行することも出来る。 // コンストラクタに実行するActionデリゲートを指定し // Startを呼ぶと起動される。 // // 別スレッドでタスクが実行されている事を確認する為に、メインスレッドのスレッドIDを表示 Console.WriteLine("Main Thread : {0}", Thread.CurrentThread.ManagedThreadId); // // Actionデリゲートを明示的に指定. // Task t = new Task(DoAction); t.Start(); t.Wait(); // // ラムダを指定. // Task t2 = new Task(() => DoAction()); t2.Start(); t2.Wait(); // // 多数のタスクを作成して実行. // List<Task> tasks = Enumerable.Range(1, 20).Select(i => new Task(DoActionWithSleep)).ToList(); tasks.ForEach(task => task.Start()); Task.WaitAll( tasks.ToArray() ); } private void DoAction() { Console.WriteLine("DoAction: {0}", Thread.CurrentThread.ManagedThreadId); } private void DoActionWithSleep() { DoAction(); Thread.Sleep(200); } } #endregion
実行結果は、例えば以下のようになります。
Main Thread : 1 DoAction: 3 DoAction: 4 DoAction: 3 DoAction: 4 DoAction: 4 DoAction: 3 DoAction: 4 DoAction: 3 DoAction: 4 DoAction: 3 DoAction: 4 DoAction: 3 DoAction: 5 DoAction: 4 DoAction: 3 DoAction: 5 DoAction: 4 DoAction: 3 DoAction: 5 DoAction: 4 DoAction: 3 DoAction: 5
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ