当多个用户访问同一页面时,这是声明 dbreaders 的正确方式吗?
public dbReader as system.Data.IDataReader
在班级水平或
Dim dbReader as System.Data.IDataReader
在类中的每个函数中。
在 VB.Net 中使 dbReader 线程安全的最佳实践是什么?
将它们声明为静态是否使其线程安全?
提前致谢,
当多个用户访问同一页面时,这是声明 dbreaders 的正确方式吗?
public dbReader as system.Data.IDataReader
在班级水平或
Dim dbReader as System.Data.IDataReader
在类中的每个函数中。
在 VB.Net 中使 dbReader 线程安全的最佳实践是什么?
将它们声明为静态是否使其线程安全?
提前致谢,
如果您希望每个线程修改变量而不会“害怕”另一个线程将沿线某处更改它,最好用ThreadStatic
属性装饰变量。
该ThreadStatic
属性为创建的每个线程创建不同的变量实例,因此您确信不会有任何竞争条件。
示例 (来自 MSDN)
Imports System
<ThreadStatic> Shared value As Integer
如果您Dim
在函数中使用变量,则没有其他线程可以访问该变量,从而使其根据定义是线程安全的。
但是,如果您在类级别声明它,您可能希望使用SyncLock
which 将阻止其他线程访问它,如果它当前正被另一个线程使用。
例子:
Public Sub AccessVariable()
SyncLock Me.dbReader
'Work With dbReader
End SyncLock
End Sub
我建议您尽可能使用定义为线程安全的可重入函数,而不是使用类字段:
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