-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

您在委托和数组中添加了许多不必要的代码。addressof 和{}syntax 都创建实例,因此您不需要构造函数或声明,从而为您提供:

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

这是真正的主动清洁,如果您的 UI 与您的逻辑分开,则开销很低。如果这仍然是一个问题,请查看是否可以在单个方法中重构 ui 更改组来完成任务,而不是调用单个更改。然后可以彻底保护这些方法。

于 2013-11-06T22:30:08.477 回答
1

在对其他语言如何处理异步函数进行了一些研究之后,我发现以下代码可以替代编写大量样板代码以从后台线程更改控件的属性。

下面的代码片段使用lambdas(可以用来代替委托的匿名函数)来指定内联函数。这个概念在 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 回答