Как отменить асинхронную операцию в Silverlight / WCF? - PullRequest
4 голосов
/ 28 сентября 2011

Я вызываю асинхронную службу из приложения Silverlight и хочу иметь возможность отменить этот вызов после того, как он сделан.Существует вариант для e.Cancelled после завершения службы (т. Е. Если e.Cancelled Then), но как настроить значение отмененного вызова на true после его вызова?Как вы отмените этот асинхронный вызов?

Позвольте мне немного уточнить ... что я пытаюсь сделать, это вызвать один и тот же метод дважды, один за другим, и получить результаты последнего вызова вмоя коллекция.Если я вызываю асинхронный метод дважды, то нет никакой гарантии, что второй вызов вернется первым, поэтому я могу в итоге получить результаты первого вызова, поступившего последним, и получить неправильные результаты в моей коллекции.Так что я хотел бы отменить первый вызов, когда я делаю второй, чтобы я не получил результаты от первого вызова.Видя, как есть флаг Отменено в завершенных аргументах событий, я полагаю, вы должны быть в состоянии сделать это.Но как?

Ответы [ 2 ]

5 голосов
/ 28 сентября 2011

Это асинхронно ... передача передается на удаленный сервер, и она не возвращается, пока сервер не завершит работу с ним.

В основном сервер продолжит работу, но вам не нужнождать ответа.Отключите обработчик событий, завершенный вашим сервисом, и притворитесь, что он никогда не вызывался.Это даст эффект отмены операции.

Если вам действительно нужно отменить что-то в процессе на сервере, вам нужно будет сделать еще один вызов на сервер, чтобы отменить первый вызов.Предполагая, что первый вызов очень медленный, это может быть возможно.

Обновление (при изменении вопроса)

В случае, если вы укажете, сервер может отменить операциюв процессе, если второй проходит, не до клиента.e.Cancelled установлен на стороне сервера.

Однако ...:)

Вы обнаружили проблему с удобством использования клиента.Не следует ли также отложить отправку любого запроса на обслуживание, пока не пройдет задержка простоя.Таким образом, быстрый выбор не приведет к нескольким вызовам в службу.

Также ...:>

Возможно, вы также захотите отправить порядковый номер на ваши вызовы службы и вернуть его как частьрезультат.Тогда вы узнаете, является ли это последним запросом или нет.

1 голос
/ 28 сентября 2011

Похоже, что вы действительно хотите сделать, это игнорировать ответы всех, кроме самого последнего вызова.

Установить уникальный идентификатор (может быть запрос №, Guid, метка времени или что-то еще) с помощьюзапрос и убедитесь, что служба отправляет это же значение обратно.Сохраняйте идентификатор самого последнего запроса и игнорируйте ответ, который не совпадает с этим идентификатором.

Это будет безопаснее, чем отмена первого запроса, поскольку, если служба уже начала отправлять ответ до запроса отменыслучается, вы все равно получаете сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...