2013-02-15 105 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(),這是異步的。