gpt4 book ai didi

.net - 做跨线程 Winforms 的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-03 13:14:21 24 4
gpt4 key购买 nike

为了能够进行正确的跨线程访问,我使用了如下代码:

Private Delegate Sub DelSetButton(ByVal button As Button, ByVal label As String, ByVal enabled As Boolean)

Private Sub SetButton(ByVal button As Button, ByVal label As String, ByVal enabled As Boolean)
If InvokeRequired Then
Invoke(New DelSetButton(AddressOf SetButton), button, label, enabled)

Else
button.Enabled = enabled
button.Text = label

End If
End Sub

这不可爱。
  • 我必须创建一个具有相同签名的委托(delegate)
  • 我需要为每种控件类型或我想要的每个操作编写一个类似的调用

  • 我正在使用 VB.NET 9/.NET Framework 3.5。

    有没有更好的方法呢?还是我坚持使用这个模型?

    更新:

    回答完我最喜欢这个:
    Private Sub ContSetButton(ByVal button As Button, ByVal label As String, ByVal enabled As Boolean)
    Invoke(New Action(Of Button, String, Boolean)(AddressOf SetButton), button, label, enabled)
    End Sub

    Private Sub SetButton(ByVal button As Button, ByVal label As String, ByVal Enabled As Boolean)
    button.Text = label
    button.Enabled = Enabled
    End Sub

    仍然不完美,但比我最初所做的要好。

    如果你能做得比这更好,请随时回答。

    最佳答案

    (这是假设您需要比 BackgroundWorker 提供的更详细的控制 - 如果这对您来说足够了,那么这是正确的答案,正如 Mehrdad Afshari 所建议的那样。)

    您不需要创建委托(delegate)类型。使用通用 FuncAction类型。

    与其测试 InvokeRequired,您可能只想拥有两种方法 - 一种总是调用,然后是一种“Impl”(或其他)方法,它只在 UI 线程上调用并且不执行任何调用。这是对模式的改变而不是新模式,但它可能会更干净一些。

    应该可以编写一个更通用的方法来处理这个问题,但是我需要一点时间来思考它......而且我也会用 C# 而不是 VB 来呈现它......

    关于.net - 做跨线程 Winforms 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581405/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com