Как к взаимному исключению через сеть?

Необходимо ожидать C# 4.0 для выхода для получения позднего связывания, которое Вы ищете. Любое время мне нужны interop возможности, которые я переключаю назад на режим VB.Net, таким образом, я могу использовать в своих интересах возможности COM, в которых C#, кажется, испытывает недостаток.

простой метод, который я использую, создает класс в VB.Net, который делает работу IDispatch и затем представление методов, которые я хочу использовать в качестве методов своей обертки, и затем я могу назвать их по желанию от моего кода C#. Не самое изящное из решений, но это вытащило меня из затора или два за прошлые несколько месяцев.

9
задан Daniel Silveira 5 November 2009 в 18:54
поделиться

6 ответов

I think you're looking for a database transaction. A transaction will isolate your changes from all other clients.

Update: Вы упомянули, что функция в настоящее время не записывает в базу данных. Если вы хотите мьютексировать эту функцию, вам потребуется центральное место для хранения текущего держателя мьютекса. База данных может работать для этого - просто добавьте новую таблицу, которая включает имя компьютера текущего владельца. Перед запуском функции проверьте эту таблицу.

Я думаю, что ваш вопрос может вызвать путаницу. Мьютексы должны быть связаны с защитой ресурсов. Если ваша функция не обращается к базе данных, то какой общий ресурс вы защищаете?

2
ответ дан 5 December 2019 в 02:08
поделиться

Conversely consider a message queue. As mentioned, the DB should manage all of this for you either in transactions or serial access to tables (ala MyISAM).

0
ответ дан 5 December 2019 в 02:08
поделиться

You can use Terracotta to implement such functionality, if you've got a Java stack.

0
ответ дан 5 December 2019 в 02:08
поделиться

In the past I have done the following:

  1. Create a table that basically has two fields, function_name and is_running
  2. I don't know what RDBMS you are using, but most have a way to lock individual records for update. Here is some pseduocode based on Oracle:

    BEGIN TRANS

    SELECT FOR UPDATE is_running FROM function_table WHERE function_name='foo';

    -- Check here to see if it is running, if not, you can set running to 'true'

    UPDATE function_table set is_running='Y' where function_name='foo';

    COMMIT TRANS

Now I don't have the Oracle PSQL docs with me, but you get the idea. The 'FOR UPDATE' clause locks there record after the read until the commit, so other processes will block on that SELECT statement until the current process commits.

0
ответ дан 5 December 2019 в 02:08
поделиться

Даже если ваша функция в настоящее время не использует базу данных, вы все равно можете решить проблему с помощью конкретной таблицы с целью синхронизации этой функции. Специфика будет зависеть от вашей БД и того, как она обрабатывает уровни изоляции и блокировки. Например, с SQL Server вы должны установить изоляцию транзакции на повторяющееся чтение, прочитать значение из строки блокировки и обновить его внутри транзакции. Не фиксируйте транзакцию, пока ваша функция не будет выполнена. Вы также можете использовать явные блокировки таблиц в транзакции в большинстве баз данных, что может быть проще. Это, вероятно, самое простое решение, учитывая, что вы уже используете базу данных.

Если вы не хотите полагаться на базу данных по какой-либо причине, вы можете написать простую службу, которая будет принимать TCP-соединения от вашего клиента. Каждый клиент запрашивал разрешение на запуск и возвращал ответ по завершении. Сервер сможет гарантировать, что только один клиент получит разрешение на запуск одновременно. Мертвые клиенты в конечном итоге разорвали TCP-соединение и были обнаружены, если у вас была правильная настройка сохранения активности.

Решение для очереди сообщений, предложенное Xepoch, также будет работать. Вы можете использовать что-то вроде MSMQ или Java Message Queue и иметь одно сообщение, которое будет действовать как маркер выполнения. Все ваши клиенты будут запрашивать сообщение, а затем репостить его, когда это будет сделано. Вы рискуете попасть в тупик, если клиент умрет до репоста, поэтому вам нужно будет разработать логику, чтобы обнаружить это, и это может усложниться.

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

Решение для очереди сообщений, предложенное Xepoch, также будет работать. Вы можете использовать что-то вроде MSMQ или Java Message Queue и иметь одно сообщение, которое будет действовать как маркер выполнения. Все ваши клиенты будут запрашивать сообщение, а затем репостить его, когда это будет сделано. Вы рискуете попасть в тупик, если клиент умрет до повторной публикации, поэтому вам нужно будет разработать логику, чтобы обнаружить это, и это может усложниться.

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

Решение для очереди сообщений, предложенное Xepoch, также будет работать. Вы можете использовать что-то вроде MSMQ или Java Message Queue и иметь одно сообщение, которое будет действовать как маркер выполнения. Все ваши клиенты будут запрашивать сообщение, а затем репостить его, когда это будет сделано. Вы рискуете попасть в тупик, если клиент умрет до репоста, поэтому вам нужно будет разработать логику, чтобы обнаружить это, и это может усложниться.

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

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

0
ответ дан 5 December 2019 в 02:08
поделиться

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

0
ответ дан 5 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: