いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

タスク並列ライブラリ入門記-002 (タスクの実行, TPL, Task.ctor, Wait, WaitAll)


だいぶ前に、TPLについてのメモ書きを書いたままサンプルすらも放置してたのを
今日思い出しまして、今更ながらそのサンプル達をアップ・・・。もうasyncとかawaitな事になってるのに。


アップした以前の記事は以下からご参照くださいませ。


今回も、タスクの実行についての簡単なサンプル。
内容としては前回と同じで、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

================================
過去の記事については、以下のページからご参照下さい。