Добрый день.
Не могу разобраться как правильно работать с WCF-сервисом из Silverlight-клиента.
В клиенте я делаю Add Service Reference и добавляю reference на свой сервис. Генерируется класс доступа к сервису. Т.к. в Silvelight запрещены синхронные запросы, то для каждого метода создается пара: MethodNameAsync() и event MethodNameCompleted.
Для всего приложения я использую (хочу использовать) один общий объект этого класса.
И в этом и заключается проблема.
Дело в том, если из двух разных мест программы сделать запрос на сервис, то может прийди событие от чужого запроса (что согласно механизму работы event'ов вполне логично).
Т.е. следующий код может работать неверно при одновременном (однократном) запуске его из двух мест (может показаться messagebox для чужого запроса).
_myWebService.GetCustomerCompleted += (s, e) => MessageBox.Show(e.Result.Id);
_myWebService.GetCustomer(43);
Сейчас я обошел это тем, что создаю на каждое такое место свой экземпляр класса веб-сервиса. Но мне это совершенно не нравится (класс весьма большой) и хотелось бы использовать синглтон. Можно это как-нибудь сделать?
Сейчас вдруг вспомнил, что WCF генерирует не пару (метод+событие), а три (2 метода и событие). Причем второй метод аналогичен первому, но имеет еще как-то дополнительный параметр.
Пошел проверить. Оказалось, что дополнительный параметр — UserState. MSDN говорит о нем так:
AsyncCompletedEventArgs.UserState Property
Gets the unique identifier for the asynchronous task.
Т.е. решение может быть таким: на каждый вызов генерируем уникальный идентификатор, посылаем при запросе, а далее проверяем в пришедшем событии.
Извиняюсь, буду больше читать документацию