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

可能であれば、クラス フィールドを使用する代わりに、定義上スレッド セーフな再入可能関数を使用することをお勧めします。

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 に答える
1

関数で変数を使用している場合Dim、他のスレッドはその変数にアクセスできず、定義によりスレッドセーフになります。

ただし、クラス レベルで宣言してSyncLockいる場合は、現在他のスレッドによって使用されている場合に、他のスレッドがアクセスできないようにするために、 which を使用することをお勧めします。

例:

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