Поделиться DbContext среди потоков - PullRequest
0 голосов
/ 03 января 2019

Мы используем шаблон 'one dbconnection by request' в наших приложениях asp.net mvc (C # / VS 2k15).В основном мы создаем DbContext в BeginRequest и Dispose () его в EndRequest.

Я использовал для сохранения этого DbContext в HttpContext, но мы столкнулись с немного более сложным сценарием, где нам нужно было запустить несколько потоков, и это решение перестало работать, так какHttpContext не является общим для потоков.

Сначала я подумал об использовании CallContext, но его объекты должны быть Serializable, что не относится к DbContext.

(Не обязательно), о котором я думал, былосохранить DbContexts в общедоступном статическом словаре, где ключом (long) является идентификатор потока, но я думаю, что есть лучшее решение.

Какое лучшее решение для обмена DbContext между потоками?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я бы посоветовал не делать этого.

Но если вы настаиваете на этом и используете библиотеку Inversion of Control, то вполне вероятно, что она будет поддерживать Стиль жизни на поток

0 голосов
/ 03 января 2019

Какое лучшее решение для обмена DbContext между потоками?

Чтобы этого не делать.Экземпляр DbContext не может быть доступен нескольким потокам одновременно.

Просто попросите фоновые процессы создать новый DbContext в блоке using.Основные соединения с базой данных объединяются и будут использоваться повторно.

Если вы просто хотите передать экземпляр DbContext через Задачи, которые вытекают из одного http-запроса, и можете гарантировать, что к нему не будут обращаться две одновременные Задачиили Threads, тогда вы можете использовать AsyncLocal .

Вы также можете захватить локальную переменную, ссылающуюся на DbContext, и явно передать ее задаче, которую вы ожидаете.EG

await Task.Run(() =>
  {
    var e = db.MyEntity.First();
    //. . . 
   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...