タイトル | : InvokeRequiredプロパティの適用範囲について |
記事No | : 11663 |
投稿日 | : 2016/05/16(Mon) 11:52 |
投稿者 | : OrientalMelody |
いつもお世話になっております。
.Netのスレッド処理を最近使い始めたものですが、 InvokeRequiredプロパティの事実上の適用範囲について悩んでいます。
サンプルとして以下のようなプロジェクトを作成します。
(1)新規プロジェクトを立ち上げ、FormオブジェクトとしてForm1、ClassオブジェクトとしてClass1ファイルを追加します。
(2)Form1ファイルにButtonコントロールとして、Button1, TextBoxコントロールとして、Text1, Text2を貼り付けます。 (3)Class1.vbファイルに以下のコードを貼り付けます。
Public Class Class1 'フォームの参照を保持する Private _Form1 As Form1 Delegate Sub AddTextCallback(ByVal text1 As String, ByVal text2 As String, ByVal frm As Form1)
'コンストラクタ Public Sub New(ByVal frm As Form) _Form1 = CType(frm, Form1) End Sub
'複数のテキストボックスに値を設定する Public Sub Form1TextBoxSetText(ByVal sVal1 As String, ByVal sVal2 Aas String, ByVal frm As Form1)
If frm.TextBox1.InvokeRequired Then
Dim d As New AddTextCallback(AddressOf Form1TextBoxSetText) frm.Invoke(d, New Object() {sVal1, sVal2, frm}) Else frm.TextBox1.Text = sVal1 frm.TextBox2.Text = sVal2 End If End Sub End Class
(4)Form1.vbファイルに以下のコードを貼り付けます。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf ThreadA)) Thread1.IsBackground = True Thread1.Start() End Sub
Private Sub ThreadA() Dim oClass1 As New Class1(Me) oClass1.Form1TextBoxSetText("TestA", "TestB", Me) End Sub
End Class
このときの Class1.Form1TextBoxSetTextプロシージャですが、 別スレッドかどうかを If frm.TextBox1.InvokeRequired Then のみで判断しています。
frm.TextBox1.InvokeRequired と frm.TextBox2.InvokeRequired は事実上常に同じと考えても良いのでしょうか?
実際、上記のソースは問題なく動きます。
本当は業務画面には大量のコントロールがあるので、コントロール毎にプロシージャを 作りたくないのが今回の趣旨です(^^ゞ
もし何かお分かりの方がいらっしゃいましたら、 ご教示のほどよろしくお願いいたします。
|