2009-09-23 6 views
0

Je souhaite que les appels à une méthode soient parallèles. Dans cette méthode, je calcule une valeur (très rapide) et écris la valeur de ce calcul dans une table de base de données.Les threads sont bloqués dans MySqlCommand.ExecuteNonQuery()

donc j'utiliser un Threadpool

ThreadPool.QueueUserWorkItem((state) => { 
       method(); 
      }); 

Après un certain temps de calcul (non déterministe, le moment où cela se produit varie, parfois après quelques minutes, parfois au bout de quelques heures), le Threadpool est plein, mais pas avec le thread de method() mais avec le thread de ma classe mysql qui appelle MySqlCommand.ExecuteNonQuery.

Est-ce que quelqu'un a une idée de comment éviter cela? Dans la documentation des classes mysql, j'ai découvert que vous ne pouvez pas terminer une requête en cours d'exécution mais comment éviter de tels problèmes?

Répondre

5

Avez-vous besoin d'écrire toutes les valeurs dans la base de données une fois qu'elles sont calculées, ou pouvez-vous attendre jusqu'à ce que vous en ayez et effectuez une mise à jour par lots où vous en insérez plusieurs?

Vous risquez de rencontrer un problème de verrouillage si tous les threads tentent d'écrire simultanément sur la même table. Donc, essayez de stocker les numéros localement et ensuite les soumettre en un grand lot

+0

ok Maintenant, je ajoute les requêtes à une liste et envoyer cette liste chaque minute, mais maintenant je quand je remplis la liste dans mes discussions et après une minute envoyer le requêtes, l'énumération de la liste est modifiée dans les threads, qu'en est-il? J'ai essayé lock (list) {// envoyer les requêtes} mais cela ne fonctionne pas –

+0

oh ... pense que j'ai mal compris le mécanisme de verrouillage :) Je verrouille maintenant un autre objet lors de l'envoi de la liste et lors du remplissage de la liste –

Questions connexes