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
}
}
}
N'utilisez pas le 'Delay' au lieu de' Timer'. Marquer une tâche longue comme 'LongRunning' – VMAtm
Voulez-vous dire, utilisez' '' Timer''' au lieu de '' 'Delay'''? –
Oui, n'utilisez pas 'Delay' pour de telles tâches – VMAtm