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 回答