Vb.net 我应该使用SyncLock还是Interlocked?

Vb.net 我应该使用SyncLock还是Interlocked?,vb.net,multithreading,asynchronous,synchronization,synclock,Vb.net,Multithreading,Asynchronous,Synchronization,Synclock,有人能帮我理解synclock语句是如何工作的吗?我知道这里还有一些关于synclock的帖子,但我没能很好地理解这些答案。我正在尝试启动并运行一个简单的多线程示例,但遇到了问题。首先,我尝试了以下代码 Public Class Class1 Public list As List(Of Integer) = New List(Of Integer) Public Sub addInt(ByVal i As Integer) SyncLock list

有人能帮我理解synclock语句是如何工作的吗?我知道这里还有一些关于synclock的帖子,但我没能很好地理解这些答案。我正在尝试启动并运行一个简单的多线程示例,但遇到了问题。首先,我尝试了以下代码

Public Class Class1
    Public list As List(Of Integer) = New List(Of Integer)

    Public Sub addInt(ByVal i As Integer)
        SyncLock list
            list.Add(i)
        End SyncLock
    End Sub

    Public Sub MainLoop()
        While list.Count < 50
            SyncLock list
                For Each i As Integer In list
                    Debug.WriteLine(i.ToString())
                Next
            End SyncLock
        End While
    End Sub
End Class
公共类1
作为列表的公共列表(整数)=新列表(整数)
公共子加法器(ByVal i作为整数)
同步锁列表
列表.添加(i)
端同步
端接头
公共子主循环()
而列表。计数<50
同步锁列表
对于列表中作为整数的每个i
Debug.WriteLine(i.ToString())
下一个
端同步
结束时
端接头
末级
我有一个简单的winform,有两个按钮。我使用第一个按钮创建一个Class1的obj,并在一个新线程中启动MainLoop方法。我使用seconded按钮调用addInt方法。但是,该代码可能会在按下一两下后锁定。在阅读了表单中的其他问题后,我意识到synclock语句的lock对象并没有像我最初认为的那样工作,它只是一个不应该更改的任意引用对象。我认为syncLock语句只是在将处理器控制权传递给新线程之前强制执行整个代码块。所以我尝试使用另一个锁定对象,但现在它只是锁定

Public Class Class1
    Private padLock As String = "PADLOCK"
    Public list As List(Of Integer) = New List(Of Integer)

    Public Sub addInt(ByVal i As Integer)
        SyncLock padLock
            list.Add(i)
        End SyncLock

    End Sub

    Public Sub MainLoop()
        While list.Count < 50
            SyncLock padLock
                For Each i As Integer In list
                    Debug.WriteLine(i.ToString())
                Next
            End SyncLock
        End While
    End Sub
End Class
公共类1
私有挂锁为String=“挂锁”
作为列表的公共列表(整数)=新列表(整数)
公共子加法器(ByVal i作为整数)
同步锁挂锁
列表.添加(i)
端同步
端接头
公共子主循环()
而列表。计数<50
同步锁挂锁
对于列表中作为整数的每个i
Debug.WriteLine(i.ToString())
下一个
端同步
结束时
端接头
末级

有人能解释一下为什么上面的代码不起作用吗?在一篇类似的帖子中,有人提到Interlocked类会很有用,但我不知道它是什么,也不知道它是如何使用的。一个简短的“傻瓜联锁类”的解释也将不胜感激

好的,我想我解决了问题。我不认为我的线程是死锁的,我认为它只是让我的应用程序。Run()线程缺少资源。当我在MainLoop方法中的End SyncLock之后添加一个Thread.Sleep(500)调用时,程序按预期工作

如果Count永不改变,它可能永远在做这件事,本质上是寻找所有实际上已经锁定的实际用途。我看不到任何地方都使用了
addInt
。当我按下winform上的第二个按钮时,会使用addInt。有关更多信息,请参见第一段代码后的段落。联锁在这里没有帮助。没有明显的原因说明这段代码会死锁,您需要发布一个更好的示例。这段代码看起来不错。问题可能出在调用此函数的代码中。您能否将代码简化为再现问题的最小完整示例,并将所有代码一起发布?不要锁定字符串文字(就像锁定类型一样非常危险)。锁定
新对象()