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

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

プログラム

UI

下図のUIを作成します。フォームにTextBoxとButtonを配置します。

コード

下記のコードを記述します。
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 StateTask
{
  public partial class FormMain : Form
  {
    delegate void ShowMessageDelegate(string message);


    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string inparam = "Penguin";
      Task task1 = new Task(Proc, (object)inparam);
      task1.Start();

      inparam = "Duck";
      Task task2 = new Task(Proc, (object)inparam);
      task2.Start();

    }

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

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

解説

  string inparam = "Penguin";
  Task task1 = new Task(Proc, (object)inparam);
  task1.Start();
Taskクラスの作成時に、コンストラクタの第二引数にobject型の引数(state)を与えます。この引数がパラメーターになります。

private void Proc(object param)
{
  ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
  for (int i = 0; i < 10; i++) {
    this.Invoke(smd, param + " - " +Convert.ToInt16(i) + ",");
    Thread.Sleep(500);
  }
}
Taskクラスによって別スレッド実行されるメソッドの第一引数に、Taskクラスのコンストラクタで与えたstateオブジェクトが与えられます。パラメーターはobject型で与えられるため、型キャストにより変換して値を取り出します。

実行結果

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


[button1]をクリックします。2つのタスクが同時に実行され、それぞれのタスクにパラメーターが渡されていることが確認できます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2016-06-13
iPentec all rights reserverd.