Каково правильное место для добавления планировщика, управляемого базой данных, в Core ASP.NET?C#

Место общения программистов C#
Ответить
Anonymous
 Каково правильное место для добавления планировщика, управляемого базой данных, в Core ASP.NET?

Сообщение Anonymous »

Я добавил таймер в запуск класс приложения 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»