Je crée un processeur de messages pour prendre les messages d'une file d'attente
J'ai utilisé topshelf pour cela et je viens d'obtenir du code de base pour le moment. Cependant, mon processeur de messages est bloqué dans une boucle et empêche le démarrage de mon service topshelf. Je pensais que si je revenais et stockais la tâche, ce ne serait pas le cas
class Program
{
static void Main(string[] args)
{
HostFactory.Run(configure =>
{
configure.Service<WorkerService>(service =>
{
service.ConstructUsing(() => new WorkerService());
service.WhenStarted(s => s.Start());
service.WhenStopped(s => s.Stop());
});
configure.RunAsLocalSystem();
});
}
}
public class WorkerService
{
private Task _task;
private Processor _processor;
private readonly CancellationTokenSource _cancellation;
public WorkerService()
{
_cancellation = new CancellationTokenSource();
_processor = new Processor();
}
public void Start()
{
Console.WriteLine("Starting");
_task = _processor.Run(_cancellation.Token);
Console.WriteLine("I NEVER GET HERE");
}
public void Stop()
{
_cancellation.Cancel();
_task.Wait();
}
}
public class Processor
{
public async Task Run(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Running");
}
}
}
Donc, quand je regarde mes services Windows, je vois juste cette application bloquée dans "Démarrage"
Votre fonction d'exécution n'atteint pas réellement un appel d'attente (où elle se terminera et reprendra plus tard). En fait, il ne sort pas du tout. Vous êtes bloqué dans la méthode Run. Essayez de mettre ceci après votre Console.WriteLine :
await Task.Delay(200);
De plus, vous pouvez envisager de ne pas mélanger async/wait avec Task.Wait() traditionnel, car cela est également connu pour provoquer des blocages. Exemple : wait vs Task.Wait - Deadlock ?
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots