2017-02-15 4 views
-1

J'ai implémenté un service Windows avec une file d'attente stockée dans une table de base de données.Processeur élevé lorsque la file d'attente de service Windows est stockée dans une base de données

J'ai une table appelée MyQueue et chaque ligne de cette table spécifie une tâche pour le service Windows. Lorsque la tâche est terminée, la ligne est marquée avec un drapeau spécial, ce qui signifie que cette tâche a été complétée.

Mon service Windows fonctionne de la manière suivante:

while(true) 
{ 
    // get the first row from MyQueue that is not yet marked 

    // complete the task from the row 

    // mark the row as completed 
} 

Ce travaux de conception, mais comme je l'utilise while(true) il envoie en permanence des demandes à la base de données pour vérifier s'il y a des nouvelles lignes, ce qui provoque l'utilisation du processeur à augmenter plus de 60%.

Existe-t-il un moyen plus efficace d'implémenter une file d'attente stockée dans une table de base de données?

+2

Qu'est-ce qui ajoute des lignes à MyQueue? Ne pouvez-vous pas également alerter votre service? –

Répondre

0

Vous pouvez utiliser SqlTableDependency

0

Vous pouvez contrôler l'utilisation du cpu en ajoutant un peu de sommeil (selon la charge de travail) dans le thread courant lorsque aucune donnée trouvée dans la file d'attente.

while(true) 
{ 
    // get the first row from MyQueue that is not yet marked 
    if(MyQueue.Count == 0) 
    { 
     System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(1000)); 
      continue; 
    } 

    // complete the task from the row 

     // mark the row as completed 
}