Un service ouvrier est la nouvelle façon d'écrire un service Windows dans .NET CORE 3.X. La classe ouvrière étend Cette méthode est appelée lorsque l'ihostedservice commence. La mise en œuvre doit renvoyer une tâche qui représente la durée de vie des opérations longues en cours d'exécution. P>
BlockQuote> Que devrait-il renvoyer cette méthode lorsque le travail étant effectué par le service n'est pas une opération de longue date du sens habituel, mais a été entraîné par des événements? Par exemple, j'écris un service qui définit un microsoft.extensions.hosting.backgroundservice code> et instruments
exécutéasync code>. La documentation de cette méthode dit:
FileSystemWatcher code>
. Comment encapsuleriez-vous que dans une tâche code>? Il n'y a pas de
tâche.Never () code>, alors devrais-je simplement renvoyer quelque chose basé sur une tâche
très longue.delay () code> pour empêcher le service de fermer? P>
3 Réponses :
J'ai incorporé le délai dans une méthode appelée donc mon éternité code>:
exécutéasync code> ressemble à: p>
protected override async Task ExecuteAsync(CancellationToken cancel)
{
using (var watcher = new FileSystemWatcher())
{
ConfigureWatcher(watcher);
await Eternity(cancel);
}
}
Vous pouvez également utiliser un délai infini réel:
await Task.Delay(Timeout.Infinite, cancellationToken);
Pas aussi amusant que attendre l'éternité code>, mais heureux de savoir que c'est la bonne approche.
Si vous souhaitez l'appeler comme essentiellement vous pouvez attendre quelque chose em> avec certaines méthodes d'extension. P> Voici le code: P> Await "Eternity" code> ou
attendre ("Eternité", jeton) code> Si vous voulez l'annulation de l'annulation. Nous pouvons les utiliser avec la prise en charge d'annulation grâce à la valeur tuples.
protected override async Task ExecuteAsync(CancellationToken token)
{
using (var watcher = new FileSystemWatcher())
{
ConfigureWatcher(watcher);
// Use any of these methods you'd like
await "Eternity";
await ("Eternity", token);
await TimeSpan.FromDays(1);
await (TimeSpan.FromDays(1), token);
}
}
public static class GetAwaiterExtensions
{
public static TaskAwaiter GetAwaiter(this (TimeSpan, CancellationToken) valueTuple)
{
return Task.Delay((int) valueTuple.Item1.TotalMilliseconds, valueTuple.Item2)
.GetAwaiter();
}
public static TaskAwaiter GetAwaiter(this TimeSpan timeSpan)
{
return Task.Delay((int) timeSpan.TotalMilliseconds)
.GetAwaiter();
}
public static TaskAwaiter GetAwaiter(this string value)
{
if (value == "Eternity")
{
return Task.Delay(Timeout.Infinite)
.GetAwaiter();
}
throw new ArgumentException();
}
public static TaskAwaiter GetAwaiter(this (string, CancellationToken) valueTuple)
{
if (valueTuple.Item1 == "Eternity")
{
return Task
.Delay(Timeout.Infinite, cancellationToken: valueTuple.Item2)
.GetAwaiter();
}
throw new ArgumentException();
}
}