5 c# asp.net-core asp.net-core-webapi asp.net-core-3.0
你好吗?。
我在 net core 3.1 中有一个 web api,这又包含一个服务,每 X 分钟必须运行一次以执行数据迁移(我只是在测试它),但我有两个问题。
我必须强调,我的 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.");
}
}
Run Code Online (Sandbox Code Playgroud)
程序.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>();
});
}
Run Code Online (Sandbox Code Playgroud)
继承而BackgroundService不是实现IHostedService。这将为您处理启动、运行和停止服务的机制。
然而,您面临的问题是 IIS 在第一次请求服务之前不会启动您的 C# 进程。然后,如果没有请求,默认应用程序池设置将再次将其关闭。我建议设置某种计划任务来定期请求 URL 并监视服务是否正在运行。如果它停止了,您会希望收到通知,对吧?
如果您从BackgroundService类继承无限作业服务并在循环内实现您的逻辑以及所需的
await Task.Delay(TimeSpan.FromMinutes(x miutes))
Run Code Online (Sandbox Code Playgroud)
该作业将在应用程序启动后立即运行,无需任何 API 调用,并在应用程序停止时停止。
public class MyService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Console.WriteLine("test");
//await run job
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
public override async Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("start");
await ExecuteAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("stop");
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10617 次 |
| 最近记录: |