我正在创建一个消息处理器以接收队列中的消息
我已经为此使用了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服务时,我只会看到此应用停留在“启动”中
答案 0 :(得分:1)
您的运行函数实际上并未触发await调用(它将退出并稍后恢复)。实际上,它根本不会退出。您被困在Run方法中。尝试将其放在Console.WriteLine之后:
await Task.Delay(200);
此外,您可能不考虑将异步/等待与传统Task.Wait()混合使用,因为众所周知,这也会导致死锁。示例:await vs Task.Wait - Deadlock?