Обновление программы Windows, когда другие пользователи вносят изменения? - PullRequest
4 голосов
/ 22 июля 2010

Сценарий:

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

Как обновить / обновить экраны других 3 пользователей, чтобы отразить, что элемент № 3 больше не доступен?

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

Update1:

Спасибо всем - определенно есть ряд правильных ответов.

Я выбрал более простую версию сценария, которую рекомендовал Icemanind .

Ответы [ 5 ]

2 голосов
/ 22 июля 2010

Как предположил Лукас, вы можете внедрить систему в стиле «Push», которая всякий раз, когда сущность изменяется, она «проталкивается» другим подключенным пользователям.Это может быть немного сложным.Работая с унаследованной системой, способ, которым мы обрабатываем это, - через столбец «Изменить номер», но в действительности это может быть что угодно, что обновляется каждый раз, когда изменяется запись.

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

Если блокировка успешна, пользователь может обновить / удалить объект.Когда они сделаны, они «Сохранить / зафиксировать» и «Изменить номер» на объекте увеличивается.

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

1 голос
/ 22 июля 2010

Если вы используете SQL Server в качестве хранилища и ADO.NET или что-то в этом роде для доступа к данным, вам следует также проверить зависимость от SQL.

По сути, вы можете создать запросиз таблицы, и вы можете указать SQL Server уведомить вас, если какие-либо данные в этом результате запроса изменятся.

См. несколько вступительных статей по этой теме:

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

1 голос
/ 22 июля 2010

Да.Лучший способ сделать это - реализовать систему типа «push».Вот как это будет работать.Всякий раз, когда кто-то щелкает что-то на стороне клиента, клиент отправляет сообщение на сервер.Сервер должен получить этот сигнал, а затем сервер отправит сообщение обновления всем клиентам, подключенным к серверу.

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

На стороне клиента вам также понадобится второй поток, который прослушивает входящие сообщения с сервера.Как только сообщение получено, оно может обработать сообщение и предпринять все необходимые действия.

Довольно приличное руководство по программированию клиент / сервер и сокетов можно найти здесь: http://www.codeproject.com/KB/IP/serversocket.aspx

Конечно, это руководство.Вам нужно будет изменить его по своему усмотрению.

Надеюсь, что это имеет смысл и удачи!

1 голос
/ 22 июля 2010

Я бы выбрал isDirty отметку времени / флаг на предметах. Не нужно снова получать все предметы и не нужно создавать сложную пуш-систему. Время от времени перечитывайте предметы с момента последнего звонка.

1 голос
/ 22 июля 2010

Можно реализовать систему «Push», в которой когда один пользователь обновляет что-либо, сервер отправляет сообщение об обновлении всем подключенным клиентам.

...