当多个用户访问同一页面时,这是声明dbreaders的正确方法吗?
public dbReader as system.Data.IDataReader
在班级或
Dim dbReader as System.Data.IDataReader
。
在VB.Net中使dbReader线程安全的最佳做法是什么?
将它们声明为静态会使其线程安全吗?
先谢谢,
答案 0 :(得分:3)
如果您希望每个线程修改变量而没有'恐惧',另一个线程会在该行的某处更改它,最好您使用ThreadStatic
属性来装饰变量。
ThreadStatic
属性为每个创建的线程创建一个不同的变量实例,这样您就可以确信不存在任何竞争条件。
示例 (来自MSDN)
Imports System
<ThreadStatic> Shared value As Integer
答案 1 :(得分:1)
我建议你尽可能使用reentrant functions,这是根据定义线程安全而不是使用类字段:
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
答案 2 :(得分:1)
如果你在函数中Dim
变量,那么根据定义,没有其他线程可以访问该变量使其成为线程安全的。
但是,如果您在类级别声明它,您可能希望使用SyncLock
,如果当前正由另一个线程使用,则会阻止其他线程访问它。
示例:
Public Sub AccessVariable()
SyncLock Me.dbReader
'Work With dbReader
End SyncLock
End Sub