【问题标题】:Running console application as background process @ .NET 5 [duplicate]将控制台应用程序作为后台进程运行@ .NET 5 [重复]
【发布时间】:2021-09-04 01:46:14
【问题描述】:

我们已从 .NET Framework 迁移到 .NET 5,以便将我们的应用程序部署到 linux 和 windows。

最初我们使用的是 Windows 应用程序,为了支持跨平台部署,我们已迁移到控制台应用程序。

是否可以选择将其作为后台进程运行?

This 建议转换为 Windows 应用程序,但这不是一个选项。

谢谢。

【问题讨论】:

  • 这个程序是做什么的?怎么称呼?
  • 对于需要定期运行的程序,任务计划是一个不错的选择。对于需要持续运行的程序,Windows 服务是一个不错的选择。在某些情况下,您甚至可以将程序放在用户的“启动”文件夹中。请注意,这些都是特定于平台的详细信息。 Windows、Linux、Mac OS 等都有不同的方法来处理这个问题。在所有情况下,细节主要影响程序外部的内容,即如何调用它,而不是程序本身的代码。

标签: c# .net-core console-application .net-5


【解决方案1】:

在程序.cs中

  public static class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });

    }

并创建 Worker.cs 文件,您需要在其中编写这些代码行来启动调度程序服务

    public class Worker : BackgroundService
    {
        private readonly string l_ClassName = "Worker";
        public Worker()
        {
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            string l_FuncName = "OnStart";
            using (new FuncTracer(l_ClassName, l_FuncName))
            {
                try
                {
                    Logger.LogInformation(l_ClassName, l_FuncName, "Starting the Service");

                    var ScheduleServices = new ScheduleService().GetScheduleServices();

                    foreach (ScheduleJobServicesDto item in ScheduleServices)
                    {
                        if (item.ServiceEnabled)
                            switch (item.JobServiceId)
                            {
                              case 1:
                                  DataAvailabilityAndReconciliationService l_DataAvailabilityAndReconciliationService = new DataAvailabilityAndReconciliationService();
                                  l_DataAvailabilityAndReconciliationService.DoWork(123);
                                  break;
                            }
                    }
                    await Task.Delay(1000, stoppingToken);
                }
                catch (Exception ex)
                {
                    Logger.LogError(l_ClassName, l_FuncName, ex.Message);
                }

            }
        }


        public override Task StopAsync(CancellationToken cancellationToken)
        {
            string l_FuncName = "OnStart";
            Logger.LogInformation(l_ClassName, l_FuncName, "Stopping the Service");
            base.StopAsync(cancellationToken);
            Logger.LogInformation(l_ClassName, l_FuncName, "The Service Is Stopped");
            return Task.Delay(0, cancellationToken);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多