-1

Dans le passé, j'ai utilisé la minuterie pour effectuer un travail d'interrogation qui extrait les données d'une base de données et les insère dans une autre après traitement des données. J'essaye d'écrire ceci avec TPL (bibliothèque parallèle de tâche).Exécution d'un travail d'interrogation dans un service Windows avec TPL

Le code suivant est-il le Task.Delay, le moyen efficace d'exécuter un travail d'interrogation dans un service de fenêtre avec TPL?

Quand j'ai dit 'efficace' cela signifie qu'il ne consomme pas plus de ressources du système d'exploitation ni gaspillage. Jeffrey Ritcher dans cette vidéo Wintellect sur Thread Fundamentals fortement déconseille d'utiliser Thread.Sleep. Son argument est qu'une application ne devrait pas tenir un fil de discussion si elle ne l'utilise pas alors d'autres applications ou la même application peut l'utiliser à partir du pool de threads.

Je suppose Task.Delay faire en interne un Thread Sleep je suppose qu'il est inefficace.

Une autre exigence est que ce travail doit également être exécuté toutes les minutes et que le chevauchement doit être évité.

class Program 
{ 
    private CancellationTokenSource _cancellationTokenSource; 
    private Task _etlTask; 

    protected override void OnStart(string[] args) 
    { 
     _cancellationTokenSource = new CancellationTokenSource(); 

     _etlTask = Task.Run(
      async() => 
        { 
         CancellationToken token = tokenSource.Token; 

         while (!token.IsCancellationRequested) 
         { 
          await etlJob.Run(); // An ETL Job to read from DB to update another DB 

          await Task.Delay(TimeSpan.FromMinutes(1), token); 
         } 
        }); 
    } 

    protected override void OnStop() 
    { 
     _cancellationTokenSource.Cancel(); 

     try 
     { 
      _etlTask.Wait(); 
     } 
     catch (Exception e) 
     { 
      // handle exeption 
     } 
    } 
} 
+1

N'utilisez pas le 'Delay' au lieu de' Timer'. Marquer une tâche longue comme 'LongRunning' – VMAtm

+0

Voulez-vous dire, utilisez' '' Timer''' au lieu de '' 'Delay'''? –

+1

Oui, n'utilisez pas 'Delay' pour de telles tâches – VMAtm

Répondre

1

Oui, votre code semble correct.

Ce travail doit être exécuté toutes les minutes et le chevauchement doit être évité.

La façon dont il est actuellement structuré, il a une minutes de retard entre les exécutions, ce qui est pas tout à fait la même chose que « courir chaque minute ». Si cela vous convient, je le garderais tel quel.

+0

J'ai ajouté quelques commentaires à ce que je voulais dire par efficacité. Votre avis est apprécié. –

+0

'Task.Delay' n'utilise pas' Thread.Sleep'. Il utilise une minuterie. –