Topshelf开始陷入无限循环

时间:2019-07-12 16:13:31

标签: c# asynchronous task topshelf

我正在创建一个消息处理器以接收队列中的消息

我已经为此使用了topshelf,并且现在只获得了一些基本代码。但是,我的消息处理器陷入了循环,导致我的topshelf服务无法启动。我以为如果我退回并存储任务,情况就不会如此

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

因此,当我查看Windows服务时,我只会看到此应用停留在“启动”中

1 个答案:

答案 0 :(得分:1)

您的运行函数实际上并未触发await调用(它将退出并稍后恢复)。实际上,它根本不会退出。您被困在Run方法中。尝试将其放在Console.WriteLine之后:

await Task.Delay(200);

此外,您可能不考虑将异步/等待与传统Task.Wait()混合使用,因为众所周知,这也会导致死锁。示例:await vs Task.Wait - Deadlock?

相关问题