有人可以帮我理解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
我有一个简单的winform有两个按钮。我使用第一个按钮创建了Class1的obj并在新线程中启动MainLoop方法。我使用借调按钮来调用addInt方法。但是,代码可能适用于一两个印刷机,然后锁定。在阅读了这个表单中的其他问题之后,我意识到synclock语句的锁定对象不能像我最初想的那样工作,并且只是一个不应该被改变的任意引用对象。我认为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
有人可以解释为什么上面的代码不起作用?在一篇类似的文章中,有人提到Interlocked类很有用,但我无法弄清楚它是什么或者如何使用它。还将赞赏一个简短的“互锁傻瓜类”解释。
答案 0 :(得分:0)
好的我想我发现了问题。我不认为我的线程是死锁我认为它只是饿了我的Application.Run()资源线程。当我在MainLoop方法中的End SyncLock之后添加Thread.Sleep(500)调用时,程序按预期工作。