Место общения программистов C#
Anonymous
Каково правильное место для добавления планировщика, управляемого базой данных, в Core ASP.NET?
Сообщение
Anonymous » 08 сен 2025, 11:45
Я добавил таймер в запуск класс приложения ASP.NET Core . Он стреляет в некоторое время и выполняет такие операции, как регистрация образца текста. Мне нужно, чтобы он был в состоянии выполнять управляемые базой операции, такие как добавление записи в таблицу. Поэтому я стараюсь получить appdbcontext от di, но он всегда нулевой. См. Код: < /p>
Код: Выделить всё
public class Scheduler
{
static Timer _timer;
static bool _isStarted;
static ILogger _logger;
const int dueTimeMin = 1;
const int periodMin = 1;
public static void Start(IServiceProvider serviceProvider)
{
if (_isStarted)
throw new Exception("Currently is started");
_logger = (ILogger)serviceProvider.GetService(typeof(ILogger));
var autoEvent = new AutoResetEvent(false);
var operationClass = new OperationClass(serviceProvider);
_timer = new Timer(operationClass.DoOperation, autoEvent, dueTimeMin * 60 * 1000, periodMin * 60 * 1000);
_isStarted = true;
_logger.LogInformation("Scheduler started");
}
}
public class OperationClass
{
IServiceProvider _serviceProvider;
ILogger _logger;
AppDbContext _appDbContext;
public OperationClass(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_logger = (ILogger)serviceProvider.GetService(typeof(ILogger));
_appDbContext = (AppDbContext)_serviceProvider.GetService(typeof(AppDbContext));
}
public void DoOperation(Object stateInfo)
{
try
{
_logger.LogInformation("Timer elapsed.");
if (_appDbContext == null)
throw new Exception("appDbContext is null");
_appDbContext.PlayNows.Add(new PlayNow
{
DateTime = DateTime.Now
});
_appDbContext.SaveChanges();
}
catch (Exception exception)
{
_logger.LogError($"Error in DoOperation: {exception.Message}");
}
}
}
< /code>
И вот это код от запуска < /code>: < /p>
public Startup(IHostingEnvironment env, IServiceProvider serviceProvider)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
AppHelper.InitializeMapper();
Scheduler.Start(serviceProvider);
}
< /code>
Я думаю, я звоню в scheduler.start < /code> в неправильном месте. Кажется, что appdbcontext еще не готов.
Какое место для вызова планировщика. Start ?
Подробнее здесь:
https://stackoverflow.com/questions/451 ... p-net-core
1757321139
Anonymous
Я добавил таймер в запуск класс приложения ASP.NET Core . Он стреляет в некоторое время и выполняет такие операции, как регистрация образца текста. Мне нужно, чтобы он был в состоянии выполнять управляемые базой операции, такие как добавление записи в таблицу. Поэтому я стараюсь получить appdbcontext от di, но он всегда нулевой. См. Код: < /p> [code] public class Scheduler { static Timer _timer; static bool _isStarted; static ILogger _logger; const int dueTimeMin = 1; const int periodMin = 1; public static void Start(IServiceProvider serviceProvider) { if (_isStarted) throw new Exception("Currently is started"); _logger = (ILogger)serviceProvider.GetService(typeof(ILogger)); var autoEvent = new AutoResetEvent(false); var operationClass = new OperationClass(serviceProvider); _timer = new Timer(operationClass.DoOperation, autoEvent, dueTimeMin * 60 * 1000, periodMin * 60 * 1000); _isStarted = true; _logger.LogInformation("Scheduler started"); } } public class OperationClass { IServiceProvider _serviceProvider; ILogger _logger; AppDbContext _appDbContext; public OperationClass(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; _logger = (ILogger)serviceProvider.GetService(typeof(ILogger)); _appDbContext = (AppDbContext)_serviceProvider.GetService(typeof(AppDbContext)); } public void DoOperation(Object stateInfo) { try { _logger.LogInformation("Timer elapsed."); if (_appDbContext == null) throw new Exception("appDbContext is null"); _appDbContext.PlayNows.Add(new PlayNow { DateTime = DateTime.Now }); _appDbContext.SaveChanges(); } catch (Exception exception) { _logger.LogError($"Error in DoOperation: {exception.Message}"); } } } < /code> И вот это код от запуска < /code>: < /p> public Startup(IHostingEnvironment env, IServiceProvider serviceProvider) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); AppHelper.InitializeMapper(); Scheduler.Start(serviceProvider); } < /code> Я думаю, я звоню в scheduler.start < /code> в неправильном месте. Кажется, что appdbcontext [/code] еще не готов. Какое место для вызова планировщика. Start ? Подробнее здесь: [url]https://stackoverflow.com/questions/45128033/what-is-the-correct-place-to-add-a-database-driven-scheduler-in-asp-net-core[/url]