Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как реализовать такой асинхронный алгоритм ? (WCF included, and maybe Task) / 1 сообщений из 1, страница 1 из 1
19.02.2014, 18:44
    #38566664
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать такой асинхронный алгоритм ? (WCF included, and maybe Task)
Подскажите, как можно реализовать такой алгоритм.
(используется 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.


Дайте пожалуйста совет по этой задаче, как это можно реализовать. Может кто-то знает полезную ссылку почитать по этой теме ? Может кто-то подобное делал ?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как реализовать такой асинхронный алгоритм ? (WCF included, and maybe Task) / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]