Topshelf 开始陷入无限循环

Topshelf start stuck in infinite loop

我正在创建一个消息处理器来获取队列中的消息

我已经为此使用了 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 服务时,我只看到这个应用卡在 "Starting"

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

之后
await Task.Delay(200);

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