-1

変更するプロパティごとに個別のメソッドとデリゲートを作成せずに、別のスレッドからフォーム コントロールのプロパティを変更することは可能ですか?

現在、ユーザー インターフェイスを操作するためにバックグラウンド スレッドが必要なマルチスレッド アプリケーションを作成しています。コントロールのテキスト プロパティの設定などの単純なタスクを実行するために記述しているコードの量は、シングル スレッド アプリ用に記述したコードと比較して膨大な量のように感じます。

シングル スレッド アプリでは、単純に Control.text = "My Text" を使用できますが、これまでのところ、マルチスレッド アプリケーションを作成するときは、スレッド セーフな方法で同じタスクを実行するためだけに、次のすべてが必要です。

Delegate Sub ChangeTextDelegate(ByVal ctrl As Control, ByVal str As String)

Private Sub ChangeText(ByVal ctrl As Control, ByVal str As String)
    If ctrl.InvokeRequired Then
        ctrl.Invoke(New ChangeTextDelegate(AddressOf ChangeText), New Object() {ctrl, str})
        Return
    End If
    ctrl.Text = str
End Sub

このような単純なタスクには同じくらい長いと思われる同様のコードがたくさんあります。

Delegate Sub ChangeVisibilityDelegate(ByVal ctrl As Control, ByVal bool As Boolean)

Private Sub ChangeVisibility(ByVal ctrl As Control, ByVal bool As Boolean)
    If ctrl.InvokeRequired Then
        ctrl.Invoke(New ChangeVisibilityDelegate(AddressOf ChangeVisibility), New Object() {ctrl, bool})
        Return
    End If
    ctrl.Visible = bool
End Sub
4

2 に答える 2

1

他の言語が非同期関数をどのように処理するかについて調査した結果、バックグラウンド スレッドからコントロールのプロパティを変更するために多くのボイラープレート コードを記述する代わりに、次の方法があることがわかりました。

以下のコード スニペットでは、関数をインラインで指定するためにラムダ(デリゲートの代わりに使用できる無名関数) を使用しています。この概念は JavaScript では非常に一般的ですが、VB.NET でも実行可能なオプションであることがわかりました。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim trd As New Threading.Thread(Sub()
            Invoke(Sub()
                       TextBox1.Visible = False
                   End Sub)
            End Sub)
        trd.IsBackground = True
        trd.Start()
    End Sub
End Class
于 2016-11-18T16:04:18.160 に答える