2010-10-12 76 views
4

当多个用户访问同一页面时,这是否是正确的声明dbreaders方式?VB.NET中的线程安全变量

在类级public dbReader as system.Data.IDataReader

在类内的各功能Dim dbReader as System.Data.IDataReader

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

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

由于事先

+0

“难道声明为静态使得它线程安全的?” - 相反。 – 2010-10-12 16:33:28

回答

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 
+0

我使用DAAB打开和关闭连接。然后调用数据访问方法,然后将结果集返回为dbreader.From aspx页面我将声明一个dbreader,获取该数据并使用它。例如 – sony 2010-10-12 16:55:57

+0

如果sClose = 1并且iAssnKey> 0那么dbReader = DAL.GetAssnCtrlPKey(ClientKey,iAssnKey)如果Validation.Validate_DataReader(dbReader)然后如果dbReader.Read = True那么如果DB_Objects.Convert_objToBool(dbReader.Item(“Active”)) )= False Then sClose = 0 End If End If End If Validation.Close_DataReader(dbReader)End If – sony 2010-10-12 16:56:47

+0

您不应该关闭连接。你应该像我的例子那样简单地处理它们,以便它们被正确地返回到连接池。不需要类/静态字段。 – 2010-10-12 16:58:44

1

如果你是Dim荷兰国际集团的变量的函数,没有其他线程可以访问该变量,从而使其定义为线程安全。

但是,如果您在类级别声明它,则可能需要使用SyncLock,这将阻止其他线程在其他线程当前正在被其他线程使用时访问它。

例子:

Public Sub AccessVariable() 
    SyncLock Me.dbReader 
     'Work With dbReader 
    End SyncLock 
End Sub 
+0

所以如果另一个线程也访问相同的页面相同的阅读器并尝试更新或插入编码为Synlock的阅读器。这会导致检索数据的任何不一致。 – sony 2010-10-12 17:23:43

+0

@sony:如果每次使用上面的'SyncLock'来处理变量,请不要使用。 'SyncLock'是为了防止两个线程在同一个变量上工作。第二个线程将休眠直到释放锁。 – 2010-10-12 17:35:29

+0

好的,帮助。你有什么建议,比如我在课堂上有3个功能。每个函数都调用不同的数据访问方法,并将结果集作为数据读取器。现在我在aspx页面声明一个数据读取器并且像dbreader = GetFunction1Data(pkey)一样说。 – sony 2010-10-12 17:59:22

3

如果您想每个线程修改的变量没有“恐惧”另一个线程将某处改变沿线,最好是你装饰用ThreadStatic属性变量。

ThreadStatic属性为每个创建的线程创建一个不同的变量实例,因此您确信不会有任何竞争条件。

(从MSDN)

Imports System 
<ThreadStatic> Shared value As Integer 
+0

我认为这会有很大的帮助。 – sony 2010-10-12 17:19:55