2009-08-31 4 views
0

J'ai un service Windows qui utilise une boucle infinie et thread.sleep. Le temps de sommeil pour le fil est de 10 secondes.VB.net Temps de réponse du service Windows

Lorsque le service est initialement démarré ET qu'il a du travail à faire (les données existent dans SQL), il fait immédiatement ses processus. Il continue d'être réactif et de traiter les tâches toutes les 10 secondes tant qu'il a du travail à faire. Si aucune donnée n'est présente dans SQL pendant une période prolongée (c'est-à-dire 15 à 20 minutes), le service commence à répondre très lentement. Il finira par récupérer les données et les traiter, mais cela prend plus de 10 minutes au lieu de 10 secondes.

Il n'y a aucune logique dans le code disant au service de dormir. Des idées?

+1

Une chance d'afficher un extrait de code pour que nous puissions voir ce qui se passe? – twlichty

Répondre

0

Sans voir votre code, il est impossible de donner une réponse définitive; Il pourrait être le cas que vous ne rangez pas vos connexions de base de données assez rapidement.

Si vous avez quelque chose comme:

While(True) 
     Dim con as new SqlConnection(connectionString) 
     con.Open() 

     Dim cmd as New SqlCommand("usp_getJob", con) 
     cmd.CommandType = CommandType.StoredProcedure 

     Dim dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection) 
     If(dr.Read()) 
      DoSomething(dr) 
     Else 
      Thread.Sleep(10) 
     End If 
    End While 

... alors il va ouvrir des connexions plus vite qu'ils ne disparaîtront par eux-mêmes.

Il y a plusieurs suppléants et je revendiquerais en utilisant Using blocs pour permettre la connexion à retourner à la piscine de connexion aussi vite que possible:

While(True) 
     Using con as new SqlConnection(connectionString) 
      con.Open() 

      Using cmd as New SqlCommand("usp_getJob", con) 
      cmd.CommandType = CommandType.StoredProcedure 

      Using dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection) 
       If(dr.Read()) 
        DoSomething(dr) 
        dr.Close() 
       Else 
        Thread.Sleep(10) 
       End If 
      End Using 
      End Using 
     End Using 
    End While 

Ceux-ci seront ensuite appeler Dispose() sur le SqlDataReader, SqlConnection et SqlCommand - l'un des deux premiers entraînera la libération de la connexion au pool de connexions (étant donné que nous avons demandé SqlDataReader à CloseConnection à sa fermeture)

0

Totalement d'accord avec Rowland sur ce point un. Sans voir le code, il serait difficile à déterminer, mais le plus probable coupable est votre code DB.

Questions connexes