Web検索はbingがおすすめ!

Invokeメソッドのデリゲートに匿名関数を与えて、Invokeメソッドを呼び出したい - C#

Invokeメソッドのデリゲートに匿名関数を与えて、Invokeメソッドを呼び出すコードを紹介します。

概要

Invokeメソッドの第一引数には、デリゲートを与えますが、処理が単純であったり、処理が短い場合には匿名関数で記述したい場合があります。 この記事では、Invokeメソッドに匿名関数を与えて呼び出すコードを紹介します。
Invokeメソッドに匿名関数を与える場合は、匿名関数をMethodInvokerでキャストします。

プログラム例

Windows Formアプリケーションを作成します。

UI

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


クラス外部からTextBoxコントロールを参照できるよう、配置したテキストボックスのModifiersプロパティを Publicに設定します。

コード

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

namespace InvokeDemo
{
  public partial class FormInvokeAnonymousFunc : Form
  {
    public FormInvokeAnonymousFunc()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyThreadA mt = new MyThreadA(this);
      Thread t = new Thread(new ThreadStart(mt.proc));
      t.Start();
    }
  }

  class MyThreadA
  {
    FormInvokeAnonymousFunc _owner;
    public MyThreadA(FormInvokeAnonymousFunc owner)
    {
      _owner = owner;
    }

    public void proc()
    {
      _owner.Invoke((MethodInvoker)delegate
      {
        _owner.textBox1.Text = "サブスレッドからの書き込みです。";
      });
    }
  }
}

解説

サブスレッドからUIのTextBoxを操作する一般的なInvoke呼び出しになります。 Invokeの動作についてはこちらの記事を参照して下さい。
サブスレッドからtextBox1のTextプロパティを変更し、テキストボックスにメッセージを表示します。
処理が短いため、匿名関数で処理を記述しています。匿名関数を MethodInvokerでキャストしてInvokeメソッドの第一引数に与えています。

実行結果

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


[button1]をクリックします。テキストボックスに「サブスレッドからの書き込みです。」のメッセージが表示され、サブスレッドからUIの操作ができていることが 確認できました。


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