gpt4 book ai didi

c# - 如何在 asp net core 3.1 中保持托管服务的事件状态?

转载 作者:行者123 更新时间:2023-12-03 17:01:27 25 4
gpt4 key购买 nike

你好吗?。

我在 net core 3.1 中有一个 web api,这又包含一个服务,每 X 分钟必须运行一次以执行数据迁移(我只是在测试它),但我有两个问题。

  • 要运行该服务,我必须首先运行我的 api 的一些 url。问题是:如何让这个服务自动启动,而不需要运行任何api?
  • 当我停止使用 apis 几分钟时,服务停止工作。问题是:我怎样才能让服务“永远”保持活力?

  • 我必须强调,我的 web api 托管在虚拟主机中,我无法访问 IIS 的所有功能

    这是我的代码,在此先感谢您的帮助。

    MySuperService.cs
     public class MySuperService : IHostedService, IDisposable
    {
    private bool _stopping;
    private Task _backgroundTask;
    private static readonly log4net.ILog log =log4net.LogManager.GetLogger(typeof(MySuperService));
    public Task StartAsync(CancellationToken cancellationToken)
    {
    Console.WriteLine("MySuperService is starting.");
    log.Info("MySuperService is starting.");
    _backgroundTask = BackgroundTask();
    return Task.CompletedTask;
    }

    private async Task BackgroundTask()
    {
    int contador = 1;
    while (!_stopping)
    {
    Console.WriteLine("MySuperService is working--> " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    log.Info("MySuperService is working--> " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    await Task.Delay(TimeSpan.FromMinutes(3));
    contador++;
    }

    Console.WriteLine("MySuperService background task is stopping.");
    log.Info("MySuperService background task is stopping.");
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
    Console.WriteLine("MySuperService is stopping.");
    log.Info("MySuperService is stopping.");
    _stopping = true;
    if (_backgroundTask != null)
    {
    // TODO: cancellation
    await BackgroundTask();
    //await _backgroundTask;
    }
    }

    public void Dispose()
    {
    Console.WriteLine("MySuperService is disposing.");
    log.Info("MySuperService is disposing.");
    }
    }

    程序.cs
    public class Program
    {
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
    public static void Main(string[] args)
    {
    ...
    CreateHostBuilder(args).Build().Run();
    }

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

    最佳答案

    继承自 BackgroundService而不是实现 IHostedService .这将为您处理启动、运行和停止服务的机制。

    但是,您面临的问题是 IIS 直到服务的第一个请求才启动您的 c# 进程。如果没有请求,默认应用程序池设置将再次关闭它。我建议设置某种计划任务来定期请求 url 并监视服务正在运行。如果它无论如何停止,你会想要得到通知吗?

    关于c# - 如何在 asp net core 3.1 中保持托管服务的事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60086037/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com