Task にパラメーターを渡す (メンバ変数を利用して Taskにパラメーターを与える) - C#

メンバ変数を利用して Taskにパラメーターを与えるコードを紹介します。

概要

通常は state パラメータを利用してパラメーターを与えます。詳しくはこちらの記事を参照してください。
state パラメータを利用せずに、値を渡す方法として、メンバ変数を利用する方法があります。ただし、処理ごとに別の変数を用意し、Taskで処理するメソッドも処理ごとに分ける必要があります。

プログラム

UI

下図のUIを作成します。ButtonとTextBoxを配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace ParamTask
{
  public partial class FormMain : Form
  {
    delegate void ShowMessageDelegate(string message);
    private string param1;
    private string param2;

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Task t1 = new Task(Exec1);
      param1 = "Penguin";
      t1.Start();

      Task t2 = new Task(Exec2);
      param2 = "Duck";
      t2.Start();
    }

    private void Exec1()
    {
      ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
      for (int i = 0; i < 10; i++) {
        this.Invoke(smd, Convert.ToInt16(i) + param1 + ",");
        Thread.Sleep(500);
      }
    }

    private void Exec2()
    {
      ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
      for (int i = 0; i < 10; i++) {
        this.Invoke(smd, Convert.ToInt16(i) + param2 + ",");
        Thread.Sleep(500);
      }
    }

    private void ShowMessage(string message)
    {
      textBox1.Text += message+"\r\n";
    }

  }
}

解説

  Task t1 = new Task(Exec1);
  param1 = "Penguin";
  t1.Start();

  Task t2 = new Task(Exec2);
  param2 = "Duck";
  t2.Start();
2つのタスクを同時に実行します。パラメーターはフォームのクラスのメンバ変数として準備します。それぞれのタスクに別の値を渡す場合は、タスクから実行されるメソッドも、メンバ変数も分ける必要があります。それぞれのタスクで、それぞれのパラメーター変数を実行中に参照し続けるため、タスクごとにパラメーター変数を確保し、タスク実行中は値が一意になるよう保持する必要があります。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。テキストボックスに下図のメッセージが表示されます。2つのタスクが同時に実行され、それぞれに別のパラメーターが渡されていることが確認できます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-10-16
作成日: 2016-06-13
iPentec all rights reserverd.