複数のユーザーが同じページにアクセスする場合、これは宣言 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
可能であれば、クラス フィールドを使用する代わりに、定義上スレッド セーフな再入可能関数を使用することをお勧めします。
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
関数で変数を使用している場合Dim
、他のスレッドはその変数にアクセスできず、定義によりスレッドセーフになります。
ただし、クラス レベルで宣言してSyncLock
いる場合は、現在他のスレッドによって使用されている場合に、他のスレッドがアクセスできないようにするために、 which を使用することをお勧めします。
例:
Public Sub AccessVariable()
SyncLock Me.dbReader
'Work With dbReader
End SyncLock
End Sub