Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный вызов 
:(
    Опции темы
LarryBoss
Дата 23.12.2012, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.8.2012

Репутация: нет
Всего: нет



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

Это asmx веб сервис, тип проекта "Empty web aplication"
Код

    public class TestService : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
//слип для того что-бы клиент успел наверняка успеть отправить  запрос второму методу до того как вернется результат с первого
            Thread.Sleep(50); 
            return "Hello World";
        }

        [WebMethod]
        public string HelloDisney()
        {
            Thread.Sleep(50);
            return "Hello Disney";
        }
    }

Клиент, простое консольное приложение.
Код

        static void Main(string[] args)
        {
            localhost.TestService servise = new localhost.TestService();

            servise.HelloWorldCompleted += HelloBack;
            servise.HelloDisneyCompleted += DisneyBack;

            servise.HelloWorldAsync();
            servise.HelloDisneyAsync();

            Thread.Sleep(20000);

            Console.ReadKey();
        }

        private static void HelloBack(object sender, localhost.HelloWorldCompletedEventArgs e)
        {
            Console.WriteLine(e.Result);
        }

        private static void DisneyBack(object sender, localhost.HelloDisneyCompletedEventArgs e)
        {
            Console.WriteLine(e.Result);
        }
    }


И так по сути вопроса в клиентском коде выше так так он есть сейчас летит ошибка в обработчике события. Причем ошибка летит в случае если вызывается два асинхронных метода. А вот и в таком виде код уже отрабатывает нормально.
Код

    class Program
    {
        static void Main(string[] args)
        {
            localhost.TestService servise = new localhost.TestService();

            //создаем еще один прокси
            localhost.TestService servise2 = new localhost.TestService();

            servise.HelloWorldCompleted += HelloBack;
            servise2.HelloDisneyCompleted += DisneyBack;//используем service2

            servise.HelloWorldAsync();
            servise2.HelloDisneyAsync();//вызываем из service2

            Thread.Sleep(20000);

            Console.ReadKey();
        }

        private static void HelloBack(object sender, localhost.HelloWorldCompletedEventArgs e)
        {
            Console.WriteLine(e.Result);
        }

        private static void DisneyBack(object sender, localhost.HelloDisneyCompletedEventArgs e)
        {
            Console.WriteLine(e.Result);
        }
    }


Собственно мое негодование заключается в том что под каждый асинхронный вызов приходится создавать по экземпляру прокси класса. А что если бы у меня было 50 асинхронных вызовов? Понятно что от 50 вызовов методов никуда не деться, но вот создавать для этого 50 объектов это уже как-то странно для меня... Можно ли это как-то обойти? Я что-то не доделал или такое поведение задумано специально? И если да то зачем?

Это сообщение отредактировал(а) LarryBoss - 23.12.2012, 21:52
PM MAIL   Вверх
LarryBoss
Дата 23.12.2012, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.8.2012

Репутация: нет
Всего: нет



Почему происходит ошибка уже вроде разобрался, обработчики событий и метод Main находятся в разных потоках, и когда срабатывает второй обработчик он не может что-то там сделать (получить доступ к основному потоку?) так как первым потоком уже сработала блокирока.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.