2015-10-26 5 views
1

У меня есть веб-сайт MVC, который обращается к списку процессов из базы данных и выбирает «случайный» процесс, чтобы пользователь мог анализировать. Он может утверждать или не выполнять этот процесс и автоматически получать другое.Параллельный доступ к данным на MVC .NET

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

я не могу сделать это на стороне базы данных, так что должно быть решение и приложение полностью невидимым для пользователей ...

Как я могу решить эту проблему?

--- Edit

Один из сценариев будут: Пользователь получить процесс (процесс заблокирован), чем он «забывает» открытой или «закрывает» браузер. Так что мне нужно как-то разблокировать этот процесс.

Некоторые идеи, которые я имел:

  • Использование MSMQ (? Возможно ли это положить обратно в процесс, когда пользователь «забывают», чтобы закончить задание)

  • Использование статического ConcurrentBag на мой webapp, чтобы сохранить список идентификаторов при просмотре. (Будет ли IIS перерабатывают убить этот список?)

Благодаря

+0

Для этого вы можете использовать ConcurrentBag. –

+0

У вас может быть другая таблица, в которой есть «ожидающий рассмотрения», а когда выбран процесс, добавьте идентификатор в эту таблицу. При выборе процессов, если идентификатор находится в этой таблице, он уже просматривается, и вам нужно выбрать другой. –

+0

Рон, как я уже сказал по вопросу, я не могу это сделать на стороне базы данных ... – Paul

ответ

2

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

Для достижения этой цели вы можете использовать класс MemoryCache.

Помните, что это память. Таким образом, ваш сброс пула приложений может очистить память. Также, когда у вас будет более одного сервера в будущем, это может не сработать (проблема с кэшем на серверах!). В этом случае вам необходимо централизованное место для хранения этой информации. Моя рекомендация - таблица db на вашем сервере sql.

+0

Спасибо, и как лучший способ контролировать заброшенные процессы? Пользователь может закрыть браузер или забыть об открытии ... – Paul

0

Почему бы вам не использовать System.Web.HttpContext.Current.Application?

Вы можете создать собственный класс, который сохраняет идентификаторы процессов, а также управляет доступом.

Надеюсь, это поможет.

Смежные вопросы