Совместное использование объектов между потоками в C # и WCF - PullRequest
4 голосов
/ 15 января 2012

У меня есть сервер, который предоставляет конечную точку службы SOAP WCF. Этот сервер также использует платформу групповой связи под названием Ensemble (на самом деле не имеет отношения к данному вопросу) для связи с другими серверами в том же кластере.

Мне нужно обмениваться объектами / данными между отдельным потоком, который прослушивает входящие сообщения от других серверов, и потоками, которые запускают подпрограммы WCF при их вызове. Пока что я сделал самую простую вещь, которую только мог себе представить - я создал статический класс «database» со статическими членами и статическими методами - и использовал lock () для синхронизации. Таким образом, я мог получить доступ к этому классу как с сервера, так и с потока групповой связи. Моя проблема с этим заключается в том, что это как бы ломает всю «ООП вещь», и я думаю, что здесь можно сделать что-то более умное ...

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Если единственная проблема, с которой вы столкнулись в своем решении, это предполагаемая «неоперируемость», вы можете вместо этого использовать Singleton Pattern . Это широко используемый шаблон для ситуаций, когда у вас должен быть один экземпляр класса, который должен совместно использоваться несколькими частями системы, которые в противном случае отключены. Шаблон остается несколько спорным, потому что некоторые рассматривают его как прославленную версию глобальной переменной, но он эффективен при выполнении работы.

0 голосов
/ 16 января 2012

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

Напишите класс реализации службы WCF с поведением в виде множественного параллелизма и InstanceContextMode Single

Записать delagate события внутри класса реализации службы WCF. Делегат вернет тип класса MyCustomService.

Когда вы создаете экземпляр службы WCF программно (host.Open), перед этим установите для делегата функцию, которая будет возвращать экземпляр MyCustomService, который может быть одноэлементным или статическим.

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

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