Vb.net 如何编写线程安全方法?

Vb.net 如何编写线程安全方法?,vb.net,multithreading,thread-safety,Vb.net,Multithreading,Thread Safety,这是一个良好的实践,足以确保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

这是一个良好的实践,足以确保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

我相信你所说的线程安全性可能与这个术语的通常定义有所不同。该术语的正常含义是,同一方法或对象可以由多个线程同时调用,而不会出现错误或负面影响。通常,这种线程安全是通过无状态和锁定(例如,
SyncLock
)实现的


但是,在您的示例中,代码并没有试图提供这种线程安全性,或者至少没有直接提供。它确实实现了这种线程安全,但只能通过强制在同一个线程(UI线程)上执行所有调用来实现。WinForm应用程序(我认为是这样)要求所有UI工作都在UI线程上完成。因此,如果从另一个线程调用对UI执行某些操作的方法,那么它必须在完成其工作之前首先调用回UI线程。对于该特定场景,您发布的代码很好。

感谢您的精彩回答!我有时使用了
SyncLock
,我理解你的意思,但由于缺乏知识,我不理解什么是无状态。你能给我一个提示让我去了解它吗?我的意思是,如果方法或对象没有保持内部状态,那么它通常被认为是线程安全的。换句话说,只要这些方法要求所有数据作为输入参数,并将所有结果作为返回值返回,并且不将数据读写到它自己的任何字段中,那么多个线程同时调用它是安全的。如果对象在调用之间保持值,特别是如果调用其方法或属性导致其状态发生变化,那么它是不安全的,因为它的状态将不稳定。我想我最好使用的术语是不变性,因为这更一般。别担心,我完全理解了你的解释。