誰かが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
2つのボタンがある単純なWinFormがありました。最初のボタンを使用してClass1のobjを作成し、新しいスレッドでMainLoopメソッドを開始しました。そして、2番目のボタンを使用してaddIntメソッドを呼び出しました。ただし、コードは1、2回押すと機能し、その後ロックされる可能性があります。このフォームから他の質問を読んだ後、synclockステートメントのlockobjectが最初に思ったように機能せず、変更してはならない任意の参照オブジェクトであることに気付きました。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クラスは便利だと誰かが言っていましたが、それが何であるか、またはそれがどのように使用されているかを理解できませんでした。簡単な「ダミーのためのインターロッククラス」の説明もいただければ幸いです。