2010-10-12 20 views
4

Est-ce la bonne façon de dbreaders de déclaration lorsque plusieurs utilisateurs accèdent à la même page?Variable de sécurité de thread dans VB.NET

public dbReader as system.Data.IDataReader au niveau de la classe ou

Dim dbReader as System.Data.IDataReader dans chaque fonction dans une classe.

Quelle serait la meilleure pratique pour sécuriser le thread dbReader dans VB.Net? Est-ce que le fait de les déclarer comme statiques le rend sûr?

Merci à l'avance,

+0

"Est-ce que les déclarant comme statique rend thread-safe?" - Non. Au contraire. –

Répondre

1

Je vous recommande l'utilisation reentrant functions si possible qui sont thread-safe, par définition, au lieu d'utiliser des champs de classe:

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

J'utilise DAAB pour ouvrir et fermer des connexions. Et puis appelez cette méthode d'accès aux données qui à son tour renvoie resultset comme dbreader. A partir de la page aspx je vais déclarer un dbreader, obtenir ces données et l'utiliser. par exemple – sony

+0

Si sClose = 1 Et iAssnKey> 0 Alors dbReader = DAL.GetAssnCtrlPKey (ClientKey, iAssnKey) Si Validation.Validate_DataReader (dbReader) Alors si dbReader.Read = True Alors si DB_Objects.Convert_objToBool (dbReader.Item ("Active")) = False Then sClose = 0 End Si Fin Si Fin Si Validation.Close_DataReader (dbReader) Fin Si – sony

+0

Vous ne devez pas fermer les connexions. Vous devez simplement les disposer comme dans mon exemple afin qu'ils soient correctement renvoyés au pool de connexions. Aucun champ de classe/statique requis. –

1

Si vous êtes Dim ing la variable dans une fonction, aucun autre thread ne peut accéder à cette variable, ce qui le rend sûr pour les threads par définition. Toutefois, si vous le déclarez au niveau d'une classe, vous pouvez utiliser SyncLock qui empêchera les autres threads d'y accéder s'il est actuellement utilisé par un autre.

Exemple:

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

donc si un autre thread accède également à la même page du même lecteur et essaie de mettre à jour ou d'insérer ce lecteur qui est codé comme Synlock. Cela entraînerait-il des incohérences dans les données récupérées. – sony

+0

@sony: Pas si vous utilisez 'SyncLock' comme ci-dessus à chaque fois pour travailler avec la variable. 'SyncLock' est fait pour empêcher deux threads de travailler sur la même variable. Le deuxième thread dormira jusqu'à ce que le verrou soit libéré. –

+0

Ok ça aide. et que suggérez-vous, disons que j'ai 3 fonctions à l'intérieur d'une classe. Chacune de ces fonctions appelle une méthode dataaccess différente et obtient le jeu de résultats en tant que lecteur de données. Maintenant je déclare un lecteur de données dans la page aspx et dis comme dbreader = GetFunction1Data (pkey). – sony

3

Si vous souhaitez chaque thread de modifier la variable sans « peur » un autre thread va changer quelque part le long de la ligne, il est préférable que vous ornez la variable avec l'attribut ThreadStatic. L'attribut ThreadStatic crée une instance différente de la variable pour chaque thread créé afin que vous soyez sûr qu'il n'y aura pas de conditions de concurrence.

Exemple(MSDN)

Imports System 
<ThreadStatic> Shared value As Integer 
+0

Je pense que cela serait d'une grande aide. – sony