4

当多个用户访问同一页面时,这是声明 dbreaders 的正确方式吗?

public dbReader as system.Data.IDataReader在班级水平或

Dim dbReader as System.Data.IDataReader在类中的每个函数中。

在 VB.Net 中使 dbReader 线程安全的最佳实践是什么?

将它们声明为静态是否使其线程安全?

提前致谢,

4

3 回答 3

3

如果您希望每个线程修改变量而不会“害怕”另一个线程将沿线某处更改它,最好用ThreadStatic属性装饰变量。

ThreadStatic属性为创建的每个线程创建不同的变量实例,因此您确信不会有任何竞争条件。

示例 (来自 MSDN)

Imports System
<ThreadStatic> Shared value As Integer
于 2010-10-12T16:57:38.920 回答
1

如果您Dim在函数中使用变量,则没有其他线程可以访问该变量,从而使其根据定义是线程安全的。

但是,如果您在类级别声明它,您可能希望使用SyncLockwhich 将阻止其他线程访问它,如果它当前正被另一个线程使用。

例子:

Public Sub AccessVariable()
    SyncLock Me.dbReader
         'Work With dbReader
    End SyncLock
End Sub
于 2010-10-12T16:32:13.470 回答
1

我建议您尽可能使用定义为线程安全的可重入函数,而不是使用类字段:

Function GetIds() As IEnumerable(Of Integer)
    Dim result = New List(Of Integer)()
    Using conn = New SqlConnection("SomeConnectionString")
        Using cmd = conn.CreateCommand()
            conn.Open()
            cmd.CommandText = "SELECT id FROM foo"
            Using reader = cmd.ExecuteReader()
                While reader.Read()
                    result.Add(reader.GetInt32(0))
                End While
            End Using
        End Using
    End Using
    Return result
End Function
于 2010-10-12T16:29:28.470 回答