2013-02-15 109 views
0

我一直在通过互联网阅读如何解决从包含控件的不同线程更新控件的问题,并且还阅读“Pro VB 2010和.Net 4.0 Platform”,然后开始奇迹。以下代码是否以同步方式执行?异步更新控制

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

我很困惑。你真正的问题是什么? – 2013-02-15 19:36:55

+0

你想知道这个代码是否可以使用多线程运行而没有问题? – Simon 2013-02-15 19:54:29

回答

0

它广泛取决于您的通话内容。

如果您从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或主线程上进行。您使用这样的代码来确保与其他线程所拥有的控件的更改同步。

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

0

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

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