Как сделать ресурс (экран) доступным только одному пользователю за раз в распределенном .Net приложении? - PullRequest
1 голос
/ 09 декабря 2008

У меня есть клиентское серверное приложение Windows Forms, которому нужен только экран администратора. Функциональность администратора должна быть реализована таким образом, чтобы в любой момент времени только один администратор мог получить доступ к этому экрану. Клиентское приложение Windows формирует связь с сервером с помощью .NET Remoting. А серверная часть распределяется по нескольким машинам.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2008

Это проще всего сделать с помощью таблицы БД. Обычно БД уже отказоустойчива и является безопасным ресурсом для использования в сценарии с общей блокировкой. Просто имейте таблицу блокировки, которая содержит некоторую информацию о заблокированном ресурсе, у кого он есть, когда и т. Д.

Вы также можете использовать один из различных «серверов состояний» на рынке для хранения состояния блокировки. Это вводит точку отказа, если вы не инвестируете в одну из более новых технологий распределенного состояния.

Однако вы действительно настраиваетесь на дальнейшие проблемы. Вам понадобится экран, чтобы разрешить принудительную разблокировку, просмотреть, кто имеет блокировку, и т. Д. Лучше всего посмотреть, почему эта блокировка действительно необходима. Это технология или бизнес-требование? Вы можете проще и понятнее реализовать сценарий обновления пессимистичных данных, который улучшит взаимодействие с пользователем.

0 голосов
/ 09 декабря 2008

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

Что касается серверной части, вы упоминаете, что она существует на нескольких компьютерах. Является ли это топологией с балансировкой нагрузки, которая работает как один виртуальный сервер? Если это так, вам может понадобиться сохранить значение в базе данных. Думайте об этом так же, как ASP.Net сохраняет Состояние сеанса . Я могу существовать на сервере, но при наличии фермы серверов ее можно перенести на SQL Server для использования всеми серверами.

...