Как обрабатывать асинхронный прием данных в Silverlight? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть список флажков, который каждый раз, когда пользователь выбирает один элемент, моя ViewModel будет просить мою службу отправить данные, относящиеся к этому параметру.

_myService.GetAssetSpotDataCompleted += GetAssetSpotDataCompleted;

_myService.GetAssetSpotDataAsync(descItem);

Каждый выбранный элемент будет вызывать один и тот же метод обслуживанияи отладка службы отправляет обратно правильные данные.

Моя проблема возникает, когда пользователь проверяет некоторые элементы, пока данные еще не получены в моей ViewModel.Пример: пользователь выбирает элемент 1 и элемент 2, но мой viewModel по-прежнему не получает ответа от службы.

Когда моя ViewModel получает информацию, возникает проблема, я всегда получаю дважды одинаковые данные в моем e.Result.

Это означает, что он входит в метод GetAssetSpotDataAsync дважды, но всегда с одинаковым результатом вместо результата для элемента 1 и затем для элемента 2.

Я все отладили я сосредоточил внимание на этих первых двух строчках метода GetAssetSpotDataCompleted:

 ((MyServiceClient)sender).GetAssetSpotDataCompleted -= GetAssetSpotDataCompleted;
            if (e.Result != null)

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 14 февраля 2012

Происходит следующее: к моменту получения ответа на первый запрос служба обнаруживает, что 2 делегата прослушивают GetAssetSpotDataCompleted (один был добавлен, когда был сделан запрос, а другой, когда был сделан второй еще невыполненный запрос).

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

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

Одним из решений было бы добавить обработчик событий только один раз, возможно, в тот момент, когда _myService назначается во ViewModel.

Однако может быть и другая проблема, нет гарантии, что ответы на два невыполненных запроса будут приходить в том же порядке, в котором они были отправлены (хотя весьма вероятно, что они будут отправлены.) Возможно, будет лучше добавить IsBusy Логическое свойство для ViewModel и установите это значение true при выполнении невыполненного запроса, очистив его после завершения. Свяжите это свойство с элементом управления BusyIndicator (находится в наборе инструментов). Это предотвратит взаимодействие с пользователем во время выполнения асинхронной операции, которая в конечном итоге изменит состояние пользовательского интерфейса.

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