Nano Hash - криптовалюты, майнинг, программирование

Контекст базы данных и асинхронные функции в MVC 4/EF 5

Я не нашел похожих вопросов/ответов для своей цели.

В нескольких действиях моих контроллеров (приложение MVC 4/EF 5) у меня есть функции для обновления базы данных, но эти функции не влияют на вывод пользователя (функции обновления информации после выбора). И я хочу отправлять эти функции в асинхронных потоках (которые завершатся после того, как пользователь получит отображаемую страницу). Я не хочу ждать завершения потоков и рендеринга страницы. Как насчет контекста базы данных в этом случае? Время жизни моего контекста - "за запрос", и оно удаляется в Application_EndRequest:

protected virtual void Application_EndRequest()
{
    var entityContext = HttpContext.Current.Items["_Context"] as DbContext;
    if (entityContext != null)
        entityContext.Dispose();
}

Я использую собственные контексты в потоках (используя блоки для правильного размещения).

using (DbContext db = new DbContext())
{
    ....
}

Но если я хочу прикрепить объект к DbContext в потоке, я получаю сообщение об ошибке «Объект с таким же ключом уже существует в ObjectStateManager» в нескольких случаях. Это странно, потому что я использую загрузку с опцией AsNoTracking(), а состояние сущности «отсоединено» в основном контексте перед вызовом нового потока. В другом случае, когда я снова пытаюсь запросить объект из базы данных в потоке и изменить его (вместо присоединения), у меня несколько раз возникает ошибка «Объект находится в отсоединенном состоянии». Используют ли два экземпляра Context один ObjectStateManager? И ошибки появляются в зависимости от времени размещения контекста основного потока. Я имею в виду, что до или после удаления основного контекста я использую контекст в потоке...

Как я могу работать с асинхронными потоками с собственным контекстом в этой ситуации? Спасибо.


Ответы:


1

У вас есть пара проблем:

1) Если вы возьмете объект или его навигационные свойства, принадлежащие одному контексту, и попытаетесь использовать их в другом контексте, вы получите ошибки, которые вы видели.

2) Как только ваш запрос завершится, IIS сможет переработать AppDomain. Когда это произойдет в производственной среде, ваши рабочие потоки будут прерваны с крайним предубеждением. Это означает, что вы не можете полагаться на то, что рабочие потоки вообще что-либо делают.

Если вы хотите отложить какую-то дорогостоящую работу, вы должны передать ее в какую-то очередь сообщений, реализованную в другом процессе — скорее всего, в службе Windows.

23.03.2013
  • насчет 1) не знаю. Я написал нетерпеливую загрузку с помощью AsNoTracking(). Сущность отделена от контекста... Также свойства навигации. Насчет 2) - может быть... Спасибо. 23.03.2013

  • 2

    Я нашел ответ, и все работает. Запустить длительную фоновую задачу. Вы можете передать методу Task StartNew() параметр, указывающий, что задача, которую вы запускаете, является «длительной», что дает подсказку планировщику задач запустить задачу в новом потоке.

    var task = Task.Factory.StartNew(Stuff, TaskCreationOptions.LongRunning);
    

    Спасибо, medkg15

    30.03.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..