1

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を実行しないようにするにはどうすればよいですか?

助けてくれてありがとう

4

1 に答える 1

2

メソッドが呼び出されたときに新しいオブジェクト インスタンスを作成し、TryLockそれをロックに使用します。2 つのスレッド間で相互排除が必要な場合は、ロックに共通のオブジェクト インスタンスを使用する必要があります。たとえば、クラスの静的メンバーまたは両方のスレッドに渡すパラメーターです。

于 2011-01-31T14:47:27.190 に答える