0
votes

Qu'est-ce que le rendez-vous de l'arrière-plan.executeasync lorsque le travailleur est axé sur les événements?

Un service ouvrier est la nouvelle façon d'écrire un service Windows dans .NET CORE 3.X. La classe ouvrière étend microsoft.extensions.hosting.backgroundservice et instruments exécutéasync . La documentation de cette méthode dit:

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.

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 FileSystemWatcher . Comment encapsuleriez-vous que dans une tâche ? Il n'y a pas de tâche.Never () , alors devrais-je simplement renvoyer quelque chose basé sur une tâche très longue.delay () pour empêcher le service de fermer? xxx


0 commentaires

3 Réponses :


0
votes

J'ai incorporé le délai dans une méthode appelée éternité code>: xxx pré>

donc mon exécutéasync code> ressemble à: p>

protected override async Task ExecuteAsync(CancellationToken cancel)
{
    using (var watcher = new FileSystemWatcher())
    {
        ConfigureWatcher(watcher);
        await Eternity(cancel);
    }
}


0 commentaires

1
votes

Vous pouvez également utiliser un délai infini réel:

await Task.Delay(Timeout.Infinite, cancellationToken);


1 commentaires

Pas aussi amusant que attendre l'éternité , mais heureux de savoir que c'est la bonne approche.



0
votes

Si vous souhaitez l'appeler comme 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.

essentiellement vous pouvez attendre quelque chose em> avec certaines méthodes d'extension. P>

Voici le code: P>

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();
        }
    }


0 commentaires