我正在创建一个消息处理器来获取队列中的消息
我已经使用了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服务时,我只看到这个应用程序停留在“启动”状态。
发布于 2019-07-13 00:32:24
你的run函数实际上并没有遇到await调用(在那里它将退出并在稍后恢复)。事实上,它根本不存在。你被困在Run方法中了。试着把这个放在你的Console.WriteLine后面:
await Task.Delay(200);此外,您可以考虑不要将异步/等待与传统的Task.Wait()混合使用,因为这也会导致死锁。示例:await vs Task.Wait - Deadlock?
https://stackoverflow.com/questions/57010627
复制相似问题