0

各ページ リクエストで整数シーケンスを作成したい

これが私のコードです:

Public Class Test
    Inherits System.Web.UI.Page

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'integer sequence is created here
        Static Sequence As Int32 = 0
        Sequence = Sequence + 1
    End Sub

End Class

私の要件は、VB.NET コードを使用してシーケンスを作成しただけで、データベースのヘルプはありません。シーケンスは 1 から開始し、1 ずつインクリメントする必要があります。これを解決しようとする試みは、シーケンス値を保持できる Page_Load 内で STATIC 変数を使用することです。しかし、スレッドセーフではないため、私のアプローチは危険であると誰かが私に言いました。本当?または、スレッドセーフであろうとなかろうと、問題のない各リクエストのシーケンスを作成するにはどうすればよいでしょうか?

アップデート

別の方法で問題を解決しようとしました。しかし、新しいソリューションのスレッド セーフについてはよくわかりません。これが私のコードです。Singleton.Instance.Sequence関数を呼び出すと、新しいシーケンス値が生成されます。

Public NotInheritable Class Singleton
    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            Return Nested.instance
        End Get
    End Property

    Private Class Nested
        Shared Sub New()
        End Sub

        Friend Shared ReadOnly instance As New Singleton
    End Class

    Private count As Int32
    Public Function Sequence() As Int32
        count = count + 1
        Return count
    End Function
End Class

新しいソリューションはスレッド セーフですか? 代替ソリューションは大歓迎です!

4

2 に答える 2

1

小さな変更を加えるだけで、最初のソリューションをスレッドセーフにすることができます。

Public Class Test
    Inherits System.Web.UI.Page

    Static Sequence As Int32 = 0
    Private Shared lockObject As New Object

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SyncLock lockObject
            Sequence += 1
        End SyncLock
    End Sub
End Class
于 2012-06-02T03:51:40.033 に答える
1

Interlocked.Increment(safeCount)を使用する

于 2012-06-02T03:56:19.650 に答える