Vb.net 异步更新控件

Vb.net 异步更新控件,vb.net,asynchronous,synchronous,multithreading,Vb.net,Asynchronous,Synchronous,Multithreading,我一直在互联网上阅读如何解决从不同线程更新控件的问题,而不是从包含控件的线程更新控件,还阅读了“Pro VB 2010和.Net 4.0平台”,我开始想知道。以下代码是否以同步方式执行 Private Sub SaveData(ByVal filepath As String) If InvokeRequired Then Me.Invoke(New MethodInvoker(AddressOf SaveData)) Else ... the actual

我一直在互联网上阅读如何解决从不同线程更新控件的问题,而不是从包含控件的线程更新控件,还阅读了“Pro VB 2010和.Net 4.0平台”,我开始想知道。以下代码是否以同步方式执行

Private Sub SaveData(ByVal filepath As String)
   If InvokeRequired Then
      Me.Invoke(New MethodInvoker(AddressOf SaveData))
   Else
      ... the actual code
   End If
End Sub

这在很大程度上取决于您的通话环境

如果您是从UI线程或主线程调用它,那么是的,它将同步运行

如果从不是UI或主线程的线程调用它,那么它将与UI或主线程异步运行,但与调用线程同步,等待UI或主线程处理完委托

所以它可以是双向的。它可以同步和异步运行。我认为您缺少的是代码本身并不是以同步或异步方式执行的,代码的执行是同步或异步的

创建更新函数的原因:

Private Sub UpdateLabel(byval tLabel as Label, byval Value as String)
    If tLabel.Invokerequired Then
         Me.Invoke(New MethodInvoker(AddressOf UpdateLabel)
    Else
        tLabel.Text = Value
    End If
End Sub
这样,您就可以在任何时候更改文本时调用它,而不必担心跨线程异常

在单击事件期间,从UI线程调用此方法是安全的,从正在运行的后台线程调用此方法也是安全的,因为更改仍然只能在UI或主线程上进行。您可以使用这样的代码来确保对其他线程所拥有的控件所做的更改的同步性


这种更新方式旨在同步您的更改并避免交叉线程

调用
Invoke
方法是一个同步调用,它将阻止调用线程,直到委托在UI线程上完成执行


如果您想调用线程立即继续(在UI线程上的代码运行之前),请调用
BeginInvoke()
,这是异步的。

我知道这个问题有点老了,但这里有一个对Pow Ian的答案的修改,对我来说很有用

Private Sub UpdateLabel(ByVal tControl As Control, ByVal Value As String)
    If tControl.InvokeRequired Then
        tControl.Invoke(Sub() tControl.Text = Value)
    Else
        tControl.Text = Value
    End If
End Sub

这应该可以用来更改使用UI线程的任何控件的文本,即使它是从异步方法调用的。

我很困惑。你的实际问题是什么?你想知道这段代码是否可以在多个线程使用它的情况下正常运行?