Vous avez besoin de savoir si mon verrou de thread fait ce qu'il est censé en .Net?

voix
0

J'ai une application qui, avant est crée un thread appelle la base de données pour tirer une quantité X de dossiers. Lorsque les enregistrements sont extraits de la base de données un indicateur de verrouillage est réglé de sorte que ces enregistrements ne sont pas tirés à nouveau.

Une fois qu'un thread a terminé il va tirer quelques autres enregistrements forment la base de données. Quand j'appelle la base de données à partir d'un fil que je devrais mettre un verrou sur cette section de code il est appelé uniquement par ce fil à ce moment-là? Voici un exmaple de mon code (je commentais dans la zone où je la serrure):

private void CreateThreads() 
{ 
       for(var i = 1; i <= _threadCount; i++) 
    { 
        var adapter = new Dystopia.DataAdapter(); 
        var records = adapter.FindAllWithLocking(_recordsPerThread,_validationId,_validationDateTime); 
        if(records != null && records.Count > 0) 
        { 
            var paramss = new ArrayList { i, records }; 
            ThreadPool.QueueUserWorkItem(ThreadWorker, paramss);
        } 

        this.Update(); 
    } 


} 

private void ThreadWorker(object paramList) 
{ 
    try 
    { 
        var parms = (ArrayList) paramList; 
        var stopThread = false; 
        var threadCount = (int) parms[0]; 
        var records = (List<Candidates>) parms[1]; 
        var runOnce = false; 
        var adapter = new Dystopia.DataAdapter(); 
        var lastCount = records.Count; 
        var runningCount = 0; 
        while (_stopThreads == false) 
        { 


           if (records.Count > 0) 
            { 
                foreach (var record in records) 
                { 
                    var proc = new ProcRecords(); 
                    proc.Validate(ref rec); 


                    adapter.Update(rec);

                    if (_stopThreads) 
                    { 
                        break; 
                    } 
                } 
                //This is where I think I may need to sync the threads.
                //Is this correct?
                lock(this){
                records = adapter.FindAllWithLocking;  
                }             
            } 
        } 
    } 
    catch (Exception ex) 
    { 
        MessageBox.Show(ex.Message); 
    } 

SQL pour tirer des documents:

WITH cte AS ( 
  SELECT TOP (@topCount) *
  FROM Candidates WITH (READPAST) 
  WHERE 
  isLocked = 0 and
  isTested = 0 and  
  validated = 0 
  ) 
UPDATE cte 
  SET 
  isLocked = 1,
  validationID = @validationId,
  validationDateTime = @validationDateTime
  OUTPUT INSERT IGNORE ED.*;
Créé 17/08/2010 à 16:45
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

Vous ne devriez pas besoin de verrouiller vos fils comme la base de données devrait faire cela sur la demande pour vous.

Créé 17/08/2010 à 16:54
source utilisateur

voix
1

Je vois quelques problèmes.

Tout d' abord, vous testez _stopThreads == false, mais vous ne l' avez pas révélé si cette une lecture volatile. Lire la deuxième moitié de cette réponse pour une bonne description de ce que je parle.

En second lieu , le verrou est inutile car adapterest une référence locale à un objet non partagé et recordsest une référence locale qui vient d' être remplacé. Je suppose que l'adaptateur fait une connexion séparée à la base de données, mais si elle partage une connexion existante puis un certain type de synchronisation peut - être besoin d'avoir lieu puisque les objets de connexion ADO.NET ne sont généralement pas thread-safe.

Maintenant, vous aurez probablement besoin de verrouillage quelque part pour publier les résultats de l'élément de travail. Je ne vois pas où les résultats sont publiés sur le thread principal, donc je ne peux pas offrir aucune indication ici.

Soit dit en passant, j'éviter de montrer une boîte de message à partir d' un ThreadPoolfil. La raison étant que cela se bloque ce fil jusqu'à ce que la boîte de message se ferme.

Créé 17/08/2010 à 17:27
source utilisateur

voix
0

Vous ne devriez pas verrouiller (cela) depuis son vraiment facile pour vous de créer des blocages, vous devez créer un objet de verrouillage séparé. si vous recherchez « lock (this) », vous pouvez trouver de nombreux articles sur pourquoi.

Voici une question SO sur verrou (ce)

Créé 17/08/2010 à 17:01
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more