Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы, WCF
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 10

Асинхронный вызов службы: непредвиденное ожидание в работе клента

16.11.2014, 18:20. Показов 882. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем! Изучаю WCF и возник такой вопрос. Вот создаю простенькую службу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IStockService
    {
        [OperationContract]
        double GetPrice(string ticker);
 
    }
 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class StockService : IStockService, IDisposable
    {
        StockService()
        {
            Console.WriteLine("{0}:в потоке создан новый экземпляр StockService", DateTime.Now);
        }
        public double GetPrice(string ticker)
        {
            Console.WriteLine("{0}: GetPrice вызван в потоке {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(5000);   
            return 94.85;
        }
        public void Dispose()
        {
            Console.WriteLine("Йух");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(StockService));
            host.Open();
            Console.WriteLine("Для завершения нажмите <ENTER>");
            Console.ReadLine();
            host.Close();
        }
    }

То есть служба имеет всего лишь одну функцию которая возвращает число. В атрибутах указываю чтобы экземпляр службы создавался для каждой сессии и разрешаю многопоточность. Далее в конфиг файле (для примеру, чтоб проще было) присваиваю maxConcurrentSessions значение 1:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<system.serviceModel>  
    <services>
      <service name="ConcurrencyService.StockService" behaviorConfiguration="myServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/EssentialWCF"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="ConcurrencyService.IStockService"/>
        <endpoint address="mex" binding="basicHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="myServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceThrottling maxConcurrentSessions="1"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
Дальше определяю клиентскую часть таким образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void Main(string[] args)
        {
            StockServiceClient proxy;
            StockServiceClient proxy2;
            Console.WriteLine("{0}: Вызывается GetPrice", DateTime.Now);
            proxy = new StockServiceClient();
            proxy2 = new StockServiceClient();
            Thread.Sleep(10000);
            proxy.BeginGetPrice("MSFT", GetPriceCallback, proxy);
            proxy2.BeginGetPrice("MSFT", GetPriceCallback, proxy2);
            Thread.Sleep(10000);
            proxy.Close();
            proxy2.Close();
            Console.ReadLine();
        }
 
        static void GetPriceCallback(IAsyncResult ar)
        {
            try
            {
                double price = ((StockServiceClient)ar.AsyncState).EndGetPrice(ar);
                Console.WriteLine("{0}: Цена:{1}", DateTime.Now, price);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Тут я создаю два прокси класса, потом на каждом прокси практически одновременно асинхронно вызываю метод службы, после чего служба должна открыть одну сессию, а второй же вызов поставить в очередь пока не освободится первая, далее я вызываю слип на 10 сек, чтоб дождаться получения ответа от службы, после чего опять асинхронно на каждом прокси вызываю ту же службу, теоретически прокси который открыл сессию должна без проблем обратиться еще раз к этому методу службы и получить ответ, в то время как второй прокси должен оставаться блокированным. Но на деле на этом месте клиент виснет, прокси почему то не может вызвать метод службы, получается и клиент который сначала открыл сессию не может заново обратиться к службе а после закрыть канал, и второй клиент стоит в ожидании пока не освободится первый.Все так и стоит в зависнутом положении до таймаута, не понимаю в чем проблема, буду очень благодарен если кто нить сможет обьяснить почему так происходит.Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2014, 18:20
Ответы с готовыми решениями:

Асинхронный вызов: Abort и Callback
Всем привет! Недавно начал разбираться с многопоточностью в .NET. 1) Мне нужно запустить поток так, чтобы после его завершения ...

Непредвиденное значение. Вызов команды в цикле
Прошу прощения за ламерский вопрос, делаю несложный скрипт (большой опыт bash) на batch и потратил уже уйму времени на казалось бы...

Асинхронный метод поддерживающий ожидание
Добрый день! При выполнении асинхронного метода у меня возникла потребность приостановить выполнение основного потока до завершения...

2
1 / 1 / 0
Регистрация: 21.10.2014
Сообщений: 5
21.11.2014, 12:42
Мысль так-то интересная... а что сервер говорит при этом? и в каком месте виснет клиент?

Добавлено через 4 минуты
Само понятие сессии не совсем ясно. может для твоей клиентской программы это одна сессия? Я б и сам хотел в этом разобраться как-нить... ;-)

я так подозреваю клиент повисает на открытии второго канала и на этом всё кончается...

Добавлено через 10 минут
Я думаю ты поставил неразрешимое условие! запусти это на разных клиентских консолях - наверно всё правильно отработает!
0
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 10
26.11.2014, 16:19  [ТС]
(((
Вложения
Тип файла: 7z Browser.7z (19.9 Кб, 7 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2014, 16:19
Помогаю со студенческими работами здесь

Асинхронный вызов
Люди, кроме BeginInvoke EndInvoke как еще можно сделать асинхронный вызов? препод сказал, что это полуасинхронный вариант, а надо сделать...

Асинхронный вызов функции
Существует функция Get_Send. Собственно ничего не возвращает, другие потоки не трогает, как её можно попроще выполнить асинхронно ? ...

Асинхронный вызов функции
Добрый день. нужна помощь в освоении столь непростого дела как многоопытность )). Нужно сделать программку которая в фсинхронной функции...

Правильный асинхронный вызов
Здравствуйте. Есть json файл, который нужно асинхронно парсить при вызове первого Activity. Я сделал так, но это вряд ли правильно: ...

Асинхронный вызов httpWebResponse
Мне нужно вернуть строку, в класс вызвавший функцию, которая получена методом GetYoulaAdvert Попробовал так, но ругается на ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru