0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

他スレッド(タスク)からUIを操作する

Last updated at Posted at 2024-09-04

UIを他のスレッドから直接操作すると、下記のようなExceptionが発生する。

System.InvalidOperationException
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました

UIはUIスレッドからしか操作できないため、このExceptionが発生する。

この問題を解決するためには、Control.Invoke()メソッドを使用して、UI操作を適切なスレッド(UIスレッド)で行う必要がある。
以下の例では、SetLabelメソッドを使用して、UI上のラベル(label)を他のスレッドから安全に更新する方法を示す。

        /// <summary>
        /// UI上のラベルを更新する(UIスレッド)
        /// </summary>
        private void SetLabel(string text)
        {
            if (this.InvokeRequired)
            {
                //別スレッドから実行されている場合、InvokeでUIスレッドに切り替えてメソッドを呼び直す
                this.Invoke(new Action<string>(SetLabel), text);
            }
            else
            {
                label.Text = text;
            }
        }

上記のコードでは、InvokeRequiredプロパティを使用して、現在のスレッドがUIスレッドであるかを確認する。
他のスレッドからメソッドが呼ばれた場合、Invokeメソッドを使用して、UIスレッドでSetLabel()を再度呼び出し、ラベルの更新を行う。これにより、安全にUIを操作できるようになる。

Labelを更新したい他のスレッド(タスク)にはAction型でSetLabelメソッドを渡してあげればよい。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?