【问题标题】:console service that should run 24/7 not looping when deployed部署时应 24/7 运行的控制台服务不循环
【发布时间】:2021-10-19 04:51:26
【问题描述】:

我有一个在 s3 中下载和上传 img 的服务,它在本地调试模式下工作并循环 24.7,但是每当我在 QA 或 PROD 中部署它时,它会在 1 个循环后立即退出。我认为这与内存或 s3 不允许连续保存有关,但是当我注释除第一行和最后一行之外的所有代码时,我确认它只运行了一次。

这里是调用循环服务的program.cs

static class Program
    {
        private static ILogger Logger = new ServiceLogHelper();
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {


#if (DEBUG)
         
            Library.Code.Utility.EnvironemntUrl = "http://localhost";
#elif (QA)
            Library.Code.Utility.EnvironemntUrl = "http://qa.somesite.com";
  
#elif (PROD)
            Library.Code.Utility.EnvironemntUrl = "http://prod.somesite.com";
 
#endif

            // Set Environment
            if (args.Length > 0)
            {
                var enviromentArgument = args[0];
                if (enviromentArgument.StartsWith("-"))
                {
                    enviromentArgument = enviromentArgument.Substring(1);
                }
                Logger.WriteLine("enviromentArgument " + enviromentArgument + " " + DateTime.Now);
                Library.Code.Utility.EnvironemntUrl = new UriBuilder(enviromentArgument).Uri.ToString();
            }



#if (!DEBUG)
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new ImageSomeService()
                };
                ServiceBase.Run(ServicesToRun);
#else
         
            var service = new ImageSomeService();
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            #endif
        }
    }

这里是循环服务

public partial class ImageSomeService : ServiceBase
    {
        public ImageSomeService()
        {
            InitializeComponent();

            OnStart(new string[] { });
        }

        private bool Started { get; set; }

        protected override void OnStart(string[] args)
        {
            Started = true;

            do
            {
                ImageSvcHelper.RunBatch(); 
                System.Threading.Thread.Sleep(10000);
            }
            while (Started);
        }

        protected override void OnStop()
        {
            Started = false; //i put logger here but it was never printed so it means it didn't stop
        }
    }

下面是助手,我发现它只运行一次,因为它只在记录器中打印一次。但如果我在本地处于调试模式(通过 Visual Studio 运行),"Image service running in ...." 行会无限打印,直到我停止它。

public static class ImageSvcHelper
    {
       
  
        public static bool RunBatch()
        {

           
            Logger.WriteLine("Image caching running in " + Library.Code.Utility.Environment + " " + DateTime.Now);
            var minID = AppHelper.GetValue<int>(group: "LastImgID", key: "ImgID");

            

            Logger.WriteLine("minid " + minID + " " + DateTime.Now);
           //  some codes here
            System.Threading.Thread.Sleep(30000);

            return true;

        }

   
    }

【问题讨论】:

  • 你怎么知道你没有得到异常?
  • OnStart 应该启动一个新线程并返回。
  • @TheGeneral 对不起,我缩短了我的代码,那里有一个 try catch 但没有得到任何打印。记录器只打印了一行“图像服务正在运行...”然后什么也没有。

标签: c# service console-application


【解决方案1】:

服务控制管理器启动服务,但等待 30 秒 OnStart() 启动服务。所以你必须在一个新线程中运行你的循环,让 SCM 退出并管理服务。

protected override void OnStart(string[] args)
{
  Started = true;
  Task.Run(() => {
    do
    {
      ImageSvcHelper.RunBatch(); 
      System.Threading.Thread.Sleep(10000);
    }
    while (Started);
  });
}

【讨论】:

  • 这解决了我的问题。我现在可以看到它无限打印。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2013-12-06
  • 2016-01-26
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多