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.Threading;
using System.Windows.Forms;
namespace InvokeDemo
{
public partial class FormInvokeLambda : Form
{
public FormInvokeLambda()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyThread mt = new MyThread(this);
Thread t = new Thread(new ThreadStart(mt.proc));
t.Start();
}
}
class MyThread
{
FormInvokeLambda _owner;
public MyThread(FormInvokeLambda owner) {
_owner = owner;
}
public void proc()
{
_owner.Invoke((MethodInvoker)(() =>
{
_owner.textBox1.Text = "サブスレッドからの書き込みです。";
}));
}
}
}
解説
サブスレッドからUIのTextBoxを操作する一般的なInvoke呼び出しになります。
Invokeの動作については
こちらの記事を参照して下さい。
サブスレッドからtextBox1のTextプロパティを変更し、テキストボックスにメッセージを表示します。
処理が短いため、ラムダ式で処理を記述し、ラムダ式全体を MethodInvokerでキャストしてInvokeメソッドの第一引数に与えています。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。テキストボックスに「サブスレッドからの書き込みです。」のメッセージが表示され、サブスレッドからUIの操作ができていることが
確認できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用