8

谁能向我解释为什么我的服务器无缘无故停止了?在我的 IHostedService 实现下面:

public class HostServiceBox : IHostedService
    {
        public Task StartAsync(CancellationToken cancellationToken)
        {
            return Task.Run(() =>
            {
                DomonutyBoxBusiness.StartBoxListening(); //STARTUP Box listening

                while (true)
                {
                    Logging.Info(DateTime.Now + " HostServiceBox Running");
                    Thread.Sleep(10000);
                }
            }, cancellationToken);
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Logging.Info(DateTime.Now + " StopAsync");

            //TODO impplement a Stop litening all boxes
            throw new NotImplementedException();
        }
    }

这是我的日志?

    .....
2/24/2018 8:31:27 PM HostServiceBox Running
2/24/2018 8:32:27 PM HostServiceBox Running
2/24/2018 8:33:27 PM HostServiceBox Running
2/24/2018 8:34:27 PM HostServiceBox Running  <------
2/25/2018 11:22:07 AM HostServiceBox Running <-----
2/25/2018 11:23:07 AM HostServiceBox Running
2/25/2018 11:24:07 AM HostServiceBox Running
2/25/2018 11:25:07 AM HostServiceBox Running
......

看起来像在 IIS 上使用 kestrel (.Net Core) 我的方法睡了吗?为什么?

通常我的while(true)重新启动,因为我调用了 API。但是IHostedService是一个后台任务,它不应该停止吗?

github上的相关帖子

4

1 回答 1

21

用户 tym32167 走在正确的轨道上。这在部署IHostedService部分的文档中提到:

在 IIS 或常规 Azure 应用服务上,您的主机可能因应用程序池回收而关闭

IIS 应用程序池的默认空闲超时时间为 20 分钟,并且默认应用程序池回收时间为 29 小时。通常,您希望将空闲超时设置为零(禁用),并将回收设置为一个固定的时间,它会造成最小的伤害。

有一篇有趣的博客文章介绍了他们为什么选择 29 小时它还涵盖了空闲超时。

此外,如果您碰巧要部署到 Azure,那么前面链接的那篇文章建议了其他真正全时运行的部署方式(容器、WebJobs 等)。

于 2018-02-27T13:26:53.783 回答