|
Как реализовать такой асинхронный алгоритм ? (WCF included, and maybe Task)
|
|||
---|---|---|---|
#18+
Подскажите, как можно реализовать такой алгоритм. (используется WCF, но вопрос вообще не о нем, а скорее о самом принципе построения системы) Имеется несколько компонентов системы.В интерфейсе имеется функция, которая возвращает полезный ответ. Client через WCF делает запрос и результатом функции является нужный ответ. Все синхронно. Client (Client, это пользовательская программа с интерфейсом) - запрашивает Host_1, и тут же получает ответ по выходу из функции. Host_1 (WCF) - добавляет служебную информацию к запросу и отправляет на сторонний Host_Outer Host_Outer (WCF) - получает запрос, и тут же отдает ответ в возвращаемом результате функции в Host_1 (а тот отдает в Client) Client <--> Host_1 <--> Host_Outer Проблема Host_Outer решил работать асинхронно. Но для Client все должно выглядеть все также синхронно (я так думаю. иначе придется переписать его на поддержку асинхронных ответов. не уверен что у меня получится). Принцип теперь такой: Client - все также синхронно запрашивает у Host_1 Host_1 - посылает запрос в Host_Outer. Получает в ответ (на выходе функции) строчку "Ok: Guid". Что значит, что Host_Outer запрос с таким GUID принял в обработку. Host_2 - Сделал новую. службу. В нее host_Outer кидает результаты на запрос (Guid как идентификатор запроса). Client <--> Host_1 --> Host_Outer --> Host_2 -> передает данные в Host_1 (они в одном процессе запущены) Host_2 я сделал. Ответ получаю. Вопросы Как можно сделать так, чтобы для Client все выглядело синхронно ? Нужно, чтобы Host_1, получив запрос, отправил его в Host_Outer. После чего Host_2 должен асинхронно (через 100 мс) получить ответ, и записать его в какую-то общую глобальную переменную, откуда его должен считать Host_1 (все еще ожидая в функции) и вернуть в Client. Думаю оптимально будет использовать ConcurrentDictionary. В котором будут хранится ответы, упорядоченные по GUID запроса. А Host_1 должен периодически проверять. Или Host_2 должен как-то сообщить, что "встречающие самолет GUID такой-то могут найти его там-то" - чтобы Host_1 находился в каком-нибудь Event.Wait. Правда тут проблема с тем, что Event'ы именованные - не заводить же на каждый запрос именованный Event ? или таки заводить ? PS. Рассматриваю такой еще вариант решения 15569882 (создал для этого отдельную тему). С импортом интерфейса Host_2 в модели APM, после чего можно будет сделать Task.FromAsync. Хотя, я думаю это не сработает - т.к. Host_1 и Host_2 работают асинхронно. Т.е. несколько Client могут параллельно запросить что-то у Host_1 - в результате чего в Host_2 уйдет два запроса с разными Guid, но вот когда придет первый ответ, он разбудит оба Task. Дайте пожалуйста совет по этой задаче, как это можно реализовать. Может кто-то знает полезную ссылку почитать по этой теме ? Может кто-то подобное делал ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2014, 18:44 |
|
|
start [/forum/topic.php?fid=20&fpage=127&tid=1403236]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
27ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 120ms |
0 / 0 |