Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
1

Пример подписки на получение/изменение данных

27.10.2016, 16:27. Показов 1377. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, нужен пример дуплексного канала связи в таком ключе:
1 процесс запускает службу. Дальше ожидает что N клиентов отправят данные в службу, например строку, вызвав метод службы. Служба запишет эти данные во внутренний массив. А потом все полученные данные надо как то считать из процесса что запустил службу.

C#
1
2
3
4
[OperationContract]
bool SendString(string s, Uri u);
[OperationContract]
string GetString(Uri from);
В данном случае s - строка u - идентификатор клиента.

Собственно сложность в том что я не могу представить как реализовать получение данных от службы. в идеале я бы хотел на выходе нечто типа:
C#
1
2
3
4
5
6
var clients  - массив с идентификаторами клиентов
string[] results = new string[clients.Count];
for (i=0; i<clients.Count; i++)
{
   results[i] = await myService.GetString(Url clients[i]); // передаём идентификатор клиента от которого ждём строку
}

Может у кого то есть пример как такое можно организовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2016, 16:27
Ответы с готовыми решениями:

Получение содержимого ListBox при подписки на событие dbClick
Есть ListBox, там я подписался на события двойного клика мыши, получается что при клики на любую...

нужно пример кода базы данных который храниться в тхт формате(удаление, изменение и т.д)
желательно на вижуал студио или php

Получение и изменение ip адреса
Здравствуйте! Пытаюсь получить ip своего компьютера написал такой код: import socket...

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

8
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
27.10.2016, 16:45 2
Цитата Сообщение от Sinys Посмотреть сообщение
пример как такое можно организовать?
А в чем именно у вас проблема? В создании службы? В вызове ее методов клиентами? Еще в чем-то?
И да, к чему тут дуплекс, если клиенты просто вызывают метод службы. Для чего он тут нужен?
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
27.10.2016, 16:50  [ТС] 3
Есть создание службы, есть вызов ее с клиентов, но вот нет идей как грамотно организовать получение данных от службы в создавший ее процесс. В идеале мне надо что бы служба автоматически при получении данных отправляла их в нужную ячейку массива в процессе который создал эту службу.
Не опрашивать же службу каждые 10ms в ожидании результата?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
27.10.2016, 16:58 4
Цитата Сообщение от Sinys Посмотреть сообщение
нет идей как грамотно организовать получение данных от службы в создавший ее процесс.
Хм. Вот одна.
Через поведение определите службу как синглет. В службе определите событие (или несколько, как вам нужно), со стандартным аргументом или своим собственным.
Создайте экземпляр службы, подпишитесь на события, а потом передайте ее конструктору хоста (такое возможно только тогда, когда служба-синглет).
Так пойдет?
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
27.10.2016, 17:29  [ТС] 5
хм, а вот это крутая возможность, не знал что можно так доступ к службе получить.
Если я ее захостчу и во время работы буду менять данные они будут меняться или будет исключение?
Но в идеале мне всё же надо это как то оформить в таком виде:
C#
1
2
3
4
5
6
var clients  - массив с идентификаторами клиентов
string[] results = new string[clients.Count];
for (i=0; i<clients.Count; i++)
{
   results[i] = await myService.GetString(Url clients[i]); // передаём идентификатор клиента от которого ждём строку
}
Проблема в том что перед таким запросом на получение данных может быть очень долгая операция, а клиенты могут прислать данные в любой момент.
И даже если я подпишусь на событие(что само по себе очень крутая возможность) я не могу знать заранее куда записывать данные этого события. (я пишу службу с API для разработчиков)

Можно конечно сделать обертку над службой и какой то локальный список для хранения входящих данных события, а пользователь когда вызывает эту функцию вызывает неявный бесконечный поиск по списку, но это звучит очень топорно.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
27.10.2016, 17:38 6
Цитата Сообщение от Sinys Посмотреть сообщение
буду менять данные они будут меняться или будет исключение?
Смотря какие данные и в каком потоковом режиме работает служба.
Цитата Сообщение от Sinys Посмотреть сообщение
в идеале
Этот идеал мне непонятен, к сожалению
Цитата Сообщение от Sinys Посмотреть сообщение
я не могу знать заранее куда записывать данные этого события.
А зачем вам это знать? Определите тогда уж в процессе хоста события-дублеры, и вызывайте их по событию в службе. Можете свои аргументы событий предоставить и передавать через них информацию.
Кому надо-подпишется на события хоста и получит все что нужно из службы.
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
27.10.2016, 18:10  [ТС] 7
Цитата Сообщение от insite2012 Посмотреть сообщение
Смотря какие данные и в каком потоковом режиме работает служба.
C#
1
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
данные List<String> или строку какую то

Цитата Сообщение от insite2012 Посмотреть сообщение
А зачем вам это знать? Определите тогда уж в процессе хоста события-дублеры, и вызывайте их по событию в службе. Можете свои аргументы событий предоставить и передавать через них информацию.
Кому надо-подпишется на события хоста и получит все что нужно из службы.
Ну, как сказать...
У меня служба запускает другие службы к каждой из которых приписан поток который исполняет некоторый метод из исполнительного файла/длл. Заранее о методе известно только что у нее есть 1 аргумент в который передаю обьект класса с базовыми необходимыми данными. При этом я понятия не имею что будет в этом исполнительном файле, однако надо обеспечить обмен данных между тем кодом что там исполняется и остальными такими же потоками через приписанные к каждому потоку службу. При этом всё это действие по всей локальной сети распределено
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
27.10.2016, 18:14 8
Цитата Сообщение от Sinys Посмотреть сообщение
я понятия не имею что будет в этом исполнительном файле, однако надо обеспечить обмен данных между тем кодом что там исполняется и остальными такими же потоками.
Вам не кажется, что mission impossible? Вы не знаете что там, но взаимодействовать с этим незнаю_чем нужно вашему коду.
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
28.10.2016, 06:38  [ТС] 9
Цитата Сообщение от insite2012 Посмотреть сообщение
Вам не кажется, что mission impossible? Вы не знаете что там, но взаимодействовать с этим незнаю_чем нужно вашему коду.
Да решабельно, просто то что уже придумано мне не сильно нравится, можно что то элегантней придумать.
Вот идея с событиями мне нравится, но пока не могу продумать как это всё будет работать

Добавлено через 11 часов 48 минут
{"Не удалось выделить буфер управляемой памяти размером 33554432 байт. Возможно, не хватает доступной памяти."}

У меня было 10 запущенных служб в них суммарно было ~4 матрицы 5000х5000. Интересно, на что не хватило памяти? xD
0
28.10.2016, 06:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2016, 06:38
Помогаю со студенческими работами здесь

Получение и изменение атрибутов файла
Не могу найти нормального описания как получить &quot;читабельно&quot; атрибуты файлов! Максимум 2 ссылки:...

Получение или изменение SteamID
Здрасти... Играю на пиратки Rust и пишу лаунчер для сервера. Сейчас стоит задача поменять на...

Изменение/получение значения ProgressBar
Добавил динамически на форму несколько progressBar`ов, теперь вопрос, как задать им...

Получение и изменение аргументов командной строки
MASM Доброго времени суток! Задача: получить аргументы, например, ARG1=Value 1st ARG2=Value 2nd, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru