私のMVC .NETコア2.2アプリには、バックグラウンド処理を行うHostedServiceがあります。
StartapクラスのConfigureServicesメソッドに登録されています
services.AddHostedService<Engines.KontolerTimer>();
これはユーザーのリクエストに依存しないバックグラウンドサービスであるため、アプリが起動したらすぐにバックグラウンドサービスを開始したいと思います。 HostedServiceが最初のユーザーリクエストの後に見つめるケースです。
MVCコアアプリの起動時にHostedServiceを起動する適切な方法は何ですか
私のサービスは次のようになります https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/hosted-services?view=aspnetcore-2.2
internal class TimedHostedService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("Timed Background Service is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
アプリの起動に問題があるようです。
私のポーグラムcsは次のようになります
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
そして、最初のユーザー要求の前にブレークポイントに到達しません。私は何かを見逃していますか、これはVS2017によって作成されたデフォルトの.Net Coreアプリです
これが私のstarup.csです
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
private Models.Configuration.SerialPortConfiguration serialPortConfiguration;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddDbContext<Data.Parking.parkingContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddHostedService<Engines.KontolerTimer>();}
(古いWindowsサービスと同様に)バックグラウンドタスクを実行するサービスが必要な場合は、以下を使用することをお勧めします。 https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/ generic-host?view = aspnetcore-2.2 WebHostの代わり。
WebHostは単純なバックグラウンドジョブのように見えるので、おそらく必要のない多くの要素を追加します(コードを読み取ることを前提としています)。