.NET

C#Invokeメソッド使用法~別スレッドからフォーム部品を更新~

今回はC#のInvokeメソッドを紹介します。
この記事は以下のような方におすすめです。

  • 別スレッドからFormのラベルやテキストボックスを更新したい
  • スレッドセーフな設計をしたい

Invokeメソッドを紹介しようと思った背景

C#というとWindowsフォームを使用した開発をすることが多いと思います。
管理人もC#ではWindowsフォームの開発が多いです。
今回はフォームを起動しているスレッドとは別のスレッドからラベルやテキストボックス等の
更新をすると例外が発生します。
今回はその解決方法の1つとしてC#のInvokeメソッドを紹介しようと思った次第です。

Invokeメソッドの概要

Invokeメソッドには引数なしのものと、引数があるものとがあります。
詳しくはマイクロソフトの公式サイトで確認してください。
今回は引数ありの方を使用方法を紹介します。

Invokeメソッドの使用法

ここからは実際のコードを使ってInvokeメソッドの使用法を紹介していきます。
今回はフォームに貼り付けたラベルの更新をするメソッドを書いていきます。

用意したコード


コードを解説していくと、まずはdelegateを用意します。
次に更新用のメソッドを用意します。
中身はラベルを更新するいたって簡単なコードです。
そして外部から呼ぶ用のメソッドを作成します。ここでInvokeメソッドを使用します。

ここがポイント

このInvokeメソッドを呼ぶメソッド内でInvokeメソッドが必要かどうか判断する
InvokeRequiredプロパティを使用して判定を行います。
これを使用することでInvokeを呼ぶだけのメソッドを作る必要がなくなり
コードがスマートになります。

実装したInvokeメソッドの確認

さて簡単んなコードですが実装したところで、動作確認を軽くしてみたいと思います。
Windowsフォームにラベルを用意して、別スレッドからラベルを更新してみましょう。
Invokeメソッドを実装したことでラベルを更新しても例外が発生しなくなったかと思います。
フォームと同じスレッドで呼ばれた場合は普通にメソッドが呼ばれた形となります。
みなさんも上手くいったでしょうか?

最後に

今回はフォームとは別のスレッドからフォームの部品を更新する方法を紹介しました。
これを上手くする実装することでWindowsフォームでできることの幅が大きく広がると思います。
delegateとというC#の機能も出てきますがそのあたりについても慣れていきましょう。
それでは今回はこの辺で

Translate »