首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Topshelf陷入无限循环

Topshelf陷入无限循环
EN

Stack Overflow用户
提问于 2019-07-13 00:13:32
回答 1查看 436关注 0票数 1

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

我已经使用了topshelf来做这件事,现在只得到了一些基本的代码。但是,我的消息处理器停滞在一个循环中,并导致我的topshelf服务无法启动。我想,如果我返回并存储任务,情况就不会是这样

代码语言:javascript
复制
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服务时,我只看到这个应用程序停留在“启动”状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-13 00:32:24

你的run函数实际上并没有遇到await调用(在那里它将退出并在稍后恢复)。事实上,它根本不存在。你被困在Run方法中了。试着把这个放在你的Console.WriteLine后面:

代码语言:javascript
复制
await Task.Delay(200);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57010627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档