【问题标题】:How to write thread-safe methods?如何编写线程安全的方法?
【发布时间】:2018-01-01 00:11:27
【问题描述】:

这种良好做法是否足以确保 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

【问题讨论】:

    标签: vb.net multithreading thread-safety


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的出色回答!我有时用过SyncLock,我明白你的意思,但由于我缺乏知识,我不明白无国籍是什么。你能给我一个提示让我去了解一下吗?
    • 我的意思是,如果方法或对象没有维护内部状态,那么它通常被认为是线程安全的。换句话说,只要方法要求所有数据作为输入参数并将所有结果作为返回值返回,并且不对自己的任何字段读取或写入数据,那么被多个线程同时调用是安全的.如果对象在调用之间保持值,特别是如果调用其方法或属性导致其状态发生变化,那么它是不安全的,因为它的状态将不稳定。
    • 我想也许对我来说更好的术语是 Immutability,因为它更笼统。
    • 别担心,我从你的解释中完全理解了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多