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?
我正在创建一个消息处理器来获取队列中的消息
我已经为此使用了 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?