2017-05-15 6 views
0

J'ai créé des services Windows personnalisés dans vb.net qui s'exécutent sur une minuterie et recherchent les fichiers dans un répertoire distant à traiter. Sur quelques serveurs, ils échouent sans erreur au même moment, vers 22h04 lorsque le service VSS échoue. Les erreurs de service ressemblent à:Les sauvegardes VSS provoquent l'échec du service Windows personnalisé

'Le processus ne peut pas accéder au fichier filename.txt car il est utilisé par un autre processus.'

Parfois, il n'y a pas d'erreurs mais le service se bloque. Je suppose que c'est le service VSS. Quoi qu'il en soit, il y a un pic énorme dans le processeur jusqu'à 100% et redescendre. J'ai des journaux (c'est-à-dire le fichier ci-dessus qui ne peut pas être écrit) qui me relaient toute l'activité, et chaque processus est enveloppé dans un try..catch qui rapportera aussi des exceptions aux logs pour moi. Rien ne vient de ça. Les processus échouent dans les parties aléatoires du code, généralement dans le temporisateur d'interrogation et parfois au milieu du traitement sans avertissement. Le service se bloque mais indique qu'il s'exécute toujours dans services.msc.

Quelqu'un a-t-il rencontré ce problème ou a-t-il trouvé une solution? Je pensais à rendre les services multi-threads afin que l'on puisse vérifier l'autre au cas où un thread se bloque mais je ne suis pas sûr si cela réglerait le problème. Nous avons essayé de donner plus de ressources aux serveurs et cela semble avoir aidé un peu mais n'a pas complètement résolu le problème. Certains jours ça surcharge, d'autres ça ne marche pas. En utilisant Windows Server 2008 x64.

Merci d'avance pour votre aide!

Public Shared aTimer As New Timers.Timer 

    Public Shared Sub SetTimer() 
     aTimer.Interval = 60000 
     ' Hook up the Elapsed event for the timer. 
     AddHandler aTimer.Elapsed, AddressOf OnTimedEvent 
     aTimer.Enabled = True 

    End Sub 

    ' The event handler for the Timer.Elapsed event. 
    Private Shared Sub OnTimedEvent(source As Object, e As ElapsedEventArgs) 
     Dim gen = New Service1 
     aTimer.Enabled = False 
     gen.ProcessEvents() 'This is the main function of the service 
     aTimer.Enabled = True 
    End Sub 

Répondre

0

Mise à jour:

avait jamais pensé à une solution simple comme ça, mais dans le Gestionnaire des tâches, je faites un clic droit sur le service et définir la priorité à « en temps réel » dans l'espoir que la forte charge CPU pendant les sauvegardes n'affecterait pas le service. Jusqu'ici tout va bien.

Cela peut être fait par programme, de sorte que chaque fois que le service redémarre, il est prioritaire. Ceci est dans mon OnStart():

VB.NET:

System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime