asp.netWebサイトのページをロードするたびに実行するテストコードがあります
これはコードです
Sub TryThreads()
Dim t1 = New Thread(AddressOf TryLock)
t1.Priority = ThreadPriority.Lowest
t1.Start()
Dim t2 = New Thread(AddressOf TryLock)
t2.Priority = ThreadPriority.Lowest
t2.Start()
End Sub
Sub TryLock()
Dim LockObject = New Object
SyncLock LockObject
DoTrace("entered locker")
For x = 0 To 10000
Next
DoTrace("exiting locker")
End SyncLock
DoTrace("exited locker")
End Sub
「dotrace」は、データベース内のログテーブルにレコードを追加するだけです。
これで正しい結果は、「入力」、「終了」、「終了」の順序でデータベースにエントリを含める必要があるということです。
しかし実際にデータベースを見ると、最初に2つが「入力」、次に2つが「終了」などが表示されます。これは、マルチスレッドが正常に機能していることを意味しますが、同期ロックは正しくありませんか?
どうすればこれを修正できますか?実際のコードはデータベースにレコードを追加し、異なるセッションの複数のページから呼び出される可能性がありますが、同じコードを2回同時に実行してはなりません
私は誰かが助けてくれてありがとう
どうもありがとうございます!!!
編集:
Sashasのすばらしい投稿に応えて、コードをクラスに変更しました(モジュール内にありました)。これで、次のようになります。
Public Class CheckClass
Property LockObject As Object
Get
If HttpRuntime.Cache("CheckSessionsLock") Is Nothing Then HttpRuntime.Cache("CheckSessionsLock") = New Object
Return HttpRuntime.Cache("CheckSessionsLock")
End Get
Set(ByVal value As Object)
If value Is Nothing Then
HttpRuntime.Cache.Remove("CheckSessionsLock")
Else
HttpRuntime.Cache("CheckSessionsLock") = value
End If
End Set
End Property
Sub TryThreads()
Dim t1 = New Thread(AddressOf TryLock)
t1.Priority = ThreadPriority.Lowest
t1.Start()
Dim t2 = New Thread(AddressOf TryLock)
t2.Priority = ThreadPriority.Lowest
t2.Start()
End Sub
Sub TryLock()
SyncLock LockObject
DoTrace("entered locker")
For x = 0 To 10000
Next
DoTrace("exiting locker")
End SyncLock
DoTrace("exited locker")
End Sub
End Class
今では80〜90%の時間で動作します。ページの読み込み時に私は持っています:
Dim cc = New CheckClass
cc.TryThreads()
一度に複数のページを開くと、それでも時々衝突します。しかし、私が正しければ、問題はhttpruntime.cacheほど同期ロックでは発生しません。これは、標準プロパティを使用すると、1ページでコードが100%機能するためです。
では、まったく異なるセッションからであっても、2つのスレッドが同時にtrylockを実行しないようにするにはどうすればよいですか?
助けてくれてありがとう