2017-07-25 39 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_,因为这更一般。 –