Межпроцессное блокирование в C # - PullRequest
15 голосов
/ 03 сентября 2010

Я написал API, который будет использоваться в том же окне в (1) службе Windows, (2) веб-приложении и (3) приложении Windows Form.Все они должны совместно использовать очень маленький набор общих данных (несколько целочисленных значений, дату и строку, которые я мог бы указать в качестве свойств одного класса).

Какой механизм блокировки можно использовать кросс-процесс, позволяющий трем процессам безопасно распределять ресурсы и не сталкиваться с конфликтами?

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

Ответы [ 5 ]

17 голосов
/ 04 сентября 2010

Для межпроцессной блокировки в C # /. Net вы можете использовать именованную систему Mutex .

3 голосов
/ 04 сентября 2010

Используйте объект EventWaitHandle для создания именованного события, которое каждый процесс может блокировать или блокировать.Работает в .NET 2.0 и более поздних версиях.

1 голос
/ 04 сентября 2010

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

Я использую System.Data.Sqlite для связи между службами Windows и приложениями.Даже если вы сказали, что нет баз данных, вы можете найти это достойным компромиссом.Это встроенная база данных без нагрузки администратора.Вы «отправляете» его, включив в свои приложения одну DLL, и она сохраняет ваши данные в одном файле.

Думайте о нем как о постоянном файле, к которому вы обращаетесь с помощью операторов SQL через ADO.Net;это даже спортивный интерфейс LINQ.Вы получаете блокировку через стандартные транзакции (с откатом), и это также предлагает шифрование.Вы можете изменять и просматривать его содержимое с помощью Visual Studio Service Explorer.Он работает на .Net 3.5 и .Net 4. И это с открытым исходным кодом без ограничений.Вы можете добавлять столбцы и таблицы, не нарушая существующую функциональность.Поскольку развертывание так же просто, как добавление DLL в ваше решение, его намного проще развернуть и поддержать.А поскольку строка подключения указывает на файл, она позволяет легко получить доступ к нему с удаленных компьютеров.Возможно, не так элегантно, как общие очереди или мьютексы, но это сильно упрощает для меня.

1 голос
/ 04 сентября 2010

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

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

1 голос
/ 04 сентября 2010

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

Если вышеприведенное верно, вы можете использовать простую блокировку процессов, например, Monitor, для защиты общих данных и представления WCF.конечная точка для предоставления доступа к данным из другого процесса.Использование транспорта именованных каналов для связи WCf будет очень эффективным для связи между процессами в одном и том же блоке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...