2017-07-25 67 views
1

這是一個好的做法,並且足以確保VB.NET中的方法DoSomething的線程安全性?如何編寫線程安全的方法?

Public Class MyForm : Inherits Form 

    Public Sub DoSomething(parameter As Object) 
     If Me.InvokeRequired Then 
      Me.Invoke(Sub() DoSomething(parameter)) 
     Else 
      'Do Something 
     End If 
    End Sub 

End Class 

回答

3

我相信你可能意味着一些東西通過線程安全比一詞的通常的定義不同。該術語的正常含義是可以同時由多個線程調用相同的方法或對象,而沒有錯誤或負面影響。通常,這種線程安全性是通過無狀態和鎖定完成的(例如SyncLock)。

但是,在你的例子中,代碼並不是試圖提供那種線程安全性,或者至少不是直接的。它確實實現了這種線程安全性,但只能強制所有調用在同一個單獨線程(UI線程)上執行。 WinForm應用程序(我認爲這是)要求所有UI工作都在UI線程上完成。因此,如果從另一個線程調用某個用戶界面執行某些操作的方法,那麼在完成其工作之前,必須先調用回UI線程。對於特定的情況,您發佈的代碼很好。

+0

謝謝你的出色答案!我有時使用過'SyncLock',我明白你的意思,但是由於缺乏知識,我不明白,什麼是無狀態*。你能否給我一個提示,去了解它? – VBobCat

+1

我的意思是,如果方法或對象沒有保持內部狀態,那麼它通常被認爲是線程安全的。換句話說,只要這些方法要求將所有數據作爲輸入參數並將所有結果作爲返回值返回,並且不要將數據讀取或寫入其自己的任何字段,那麼可以同時被多個線程調用。如果對象維護調用之間的值,尤其是調用它的方法或屬性導致它的狀態改變,那麼它是不安全的,因爲它的狀態是不穩定的。 –

+1

我猜可能對我來說使用的更好的術語是_Immutability_,因爲這更一般。 –