Можно ли в context.Add (объект) в асинхронном таймере? - PullRequest
1 голос
/ 14 мая 2019

Я работаю на C # ASP.net и нуждаюсь в создании объекта в моей базе данных через асинхронный таймер.

Мой таймер:

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Response response = new Response(tweet.Id, 1128199274838282240);

    _context.Add(response);
    _context.SaveChanges();
}

Когда я это называю:

Timer timer = new System.Timers.Timer(60000);

timer.Elapsed += OnTimedEvent;
timer.Enabled = true;

и я даю контекст через конструктор, когда создаю свой класс из контроллера:

    private readonly cardsagainsttwitterContext _context;

    public GameManager(cardsagainsttwitterContext context)
    {
        _context = context;
    }

И, конечно, я получаю эту ошибку, потому что контекст больше не существует: - System.InvalidOperationException: 'Предпринята попытка использовать контекст во время его настройки. Экземпляр DbContext нельзя использовать внутри OnConfiguring, поскольку он все еще настраивается на этом этапе. Это может произойти, если вторая операция запускается в этом контексте до завершения предыдущей операции. Ни один из членов экземпляра не гарантированно является потокобезопасным. '

Итак, возможно это сделать или нет? Спасибо за чтение!

1 Ответ

0 голосов
/ 14 мая 2019

Контекст должен существовать в пределах временной жизни, и обычно в веб-приложении это (со всеми моими рекомендациями) сама временная жизнь запроса или более короткая, например, переходная.

Если таймер запускается через 60 секунд, онне будет иметь контекст запроса, потому что запрос выполнен (я предполагаю ...) и контекст БД расположен в пределах его времени жизни.

Попробуйте создать другой контекст внутри события таймера и использовать его для сохраненияВаш ответ:

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Response response = new Response(tweet.Id, 1128199274838282240);
    using(var timerContext=new cardsagainsttwitterContext())
    {
        timerContext.Add(response);
        timerContext.SaveChanges();
    }
}
...