Taskを用いた並列処理 - C#

Taskクラスを用いた並列処理のコードを紹介します。

概要

Taskクラスを利用して並列処理を実行するには以下の手順を実行します。
  • Taskオブジェクトを作成する。オブジェクト作成時のコンストラクタの引数に並列処理をさせるメソッド(デリゲート)を与える
  • 作成したTaskオブジェクトのStart()メソッドを呼び出すと処理が開始される。処理は並列で実行されるため、処理の完了を待たずに次の行が実行される
となります。
また、Taskで実行される処理からメインスレッドを呼び出す場合にはInvokeメソッドを利用する必要があります。

プログラム例

UI

以下のUIを準備します。

コード

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

namespace SimpleTask
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Task t1 = new Task(Exec1);
      t1.Start();
      Task t2 = new Task(Exec2);
      t2.Start();
    }

    delegate void ShowMessageDelegate(string message);
    private void ShowMessage(string message)
    {
      textBox1.Text += message;
    }

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

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

解説

タスクを2つ作成し実行します。Taskのコンストラクタの引数にタスクで実行するメソッドを与えます。
private void button1_Click(object sender, EventArgs e)
{
  Task t1 = new Task(Exec1);
  t1.Start();
  Task t2 = new Task(Exec2);
  t2.Start();
}

メッセージを出力するためのデリゲートです。
delegate void ShowMessageDelegate(string message);
private void ShowMessage(string message)
{
  textBox1.Text += message;
}

下記のコードがタスクで実行するメソッドとタスクからメインフォームのテキストボックスに情報を表示するためのデリゲートです。
private void Exec1()
{
  ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
  for (int i = 0; i < 10; i++) {
    this.Invoke(smd,Convert.ToInt16(i)+",");
    Thread.Sleep(500);        
  }
}

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

実行結果

アプリケーションを実行し、Button1を押します。下図の結果が表示されます。(実行状況により表示内容は変わります。)
テキストボックスに0~9の値と100~109の値が混ざって表示されていることから、Exec1,exec2が同時に実行されていることがわかります。


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