WCF не в single режиме, он в per-call.
Спасибо огромное за подробный разбор кода, именно этого и ждал, действительное многое упустил из виду, хотелось бы уточнить еще некоторые моменты:
1. Если я буду использовать ConcurrentDictionary это же решит эту проблему ?
2. Тогда тут мне нужно удалять из словаря только те итемы которые обработал.
3. Parallel.ForEach использую чтобы параллельно запускать задачи на разные девайсы, задачи же на один девайс должны идти по очереди, addCall может работает только с одним девайсом, блокирую поток для того чтобы когда, отработает конкретный "call" от пользователя который он послал, вернуть пользователю callback - т.к как команда с wcf-proxy будет вызываться в async версии.
5. Забыл описать, что в hangfire на этот метод поставлю ограничения по concurency в 1.
6. Это держал в голове, пока не так важно, но понимаю что тут тоже надо использовать ConcurrentDictionary .
Скажите пожалуйста, с моими предложенными правками это решение имеет право на жизнь?
Александр Евгеньевич: вообще в идеале хотел провернуть конструкцию, что то вроде:
Controller controllers = Controller.getAll();
foreach (var ctr in controllers)
{
ctr.callMethod() -> где в классе контроллера в этом методе, из атрибута deviceType автоматически понимается класс и для этого класса вызывается метод callMethod(), без всяких switch и if.
}
пока вариант в голове, создать helper который будет принимать ctr на вход, в таблице device хранить атрибут ClassName, и в функции хелпера, через reflection вызывать метод класса например Macdonals.callMethod(ctr)
Александр Евгеньевич: я хотел разделить методы для разных мануфакторов в разные классы, чтобы например manufactirer1instance давал список методов, которые только для него. Ну и чтобы методы с одинаковыми названиями, выполняли разную логику. Но пока я отказался от этой идеи, так как мне нужно использовать эти данные и для отображения на UI, а условный метод сервиса getAll должен отдавать List<конкретного типа>, а у меня бы после orm было бы много типов. Вообщем сам себя запутал)
А вам спасибо за помощь) скопируйте свой коммент в ответ, я помечу как решение.
Александр Евгеньевич: обновил вопрос. Device это грубо говоря перечень моделей контроллеров с некими характеристиками, name у контроллеров это его пользовательское наименование.
ночью не заметил, что мой пример вообще с while не работает, сейчас запустил и заметил 100% занятость одного из цпу. То, что это все не относится к wcf я понимаю, просто удобнее было объяснить на примере.
lock я не использовал, так как не хочу создавать дополнительную вложенность (просто имхо), но сути вопроса это ведь не меняет, lock делает то же самое что monitor.enter\exit.
отвечу на "То есть когда на странице заказа, допустим, нужно одно, на странице авторизации - другое", React.render можно вызвать для любого div, т.е конечно можно использовать его для написания модулей для страницы которая генерируется на сервере. Я когда изучал react в начале его использовал в связке express+jade, но по мере изучения, приходишь к мысли, что получишь от фреймворка намного больше пользы перейдя на SPA. К тому же можно его рендерить на сервере, если нужно.
Roman_Kh: спасибо вам, я только сейчас понял, что в итоге все размазал и запутался, самое смешное, что я изначально делал как раз как вы написали signupModal, потом стукнуло в голову, что надо написать универсальный компонент и поехало.. :)
Roman_Kh хотя немного подумав, я пришел к выводу, что я хотел сделать многоразовый компонент который бы из вне мог менять свое поведение, что действительно не правильно, а то что предлагаете вы по видимому действительно истина. Чтобы оставить компонент многоразовым я могу добавить всего лишь кнопку закрытия формы она же "подтвердить" для случая регистрации. Тогда конечно компонент немного теряет в универсальности, допустим если для другого диалога мне понадобится в последней строке не одна кнопка, а две.. Подожду пока еще вариантов решения.