VB.NET中的线程安全变量

时间:2010-10-12 16:24:25

标签: vb.net vb.net-2010

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

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

在类中的每个函数中

Dim dbReader as System.Data.IDataReader

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

将它们声明为静态会使其线程安全吗?

先谢谢,

3 个答案:

答案 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