メンバ変数を利用して 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