Дуплексная служба Silverlight 4 - остановка обратного вызова
У меня есть приложение Silverlight 4, которое использует дуплекс WCF путем создания обратного вызова для клиента. От клиента у меня есть метод, который извлекает все строки из базы данных (не совсем, но для этого примера). Каждая строка отправляется клиенту с помощью обратного вызова. Мне нужно выяснить, как прервать этот процесс после начала. Например, скажем, мне надоело видеть, как все строки из этой таблицы прокручиваются на моем экране. Я хочу видеть строки из другой таблицы. Как мне остановить первое действие, пока оно в середине?
Я думал, что мог бы просто создать новую операцию на сервере, чтобы прервать обработку, но это ничего не изменит с тем, что уже было отправлено через обратный вызов и ожидание, которое будет получено клиентом.
Я ищу способ гарантировать, что после начала нового поиска у меня не останется никаких старых данных, которые будут получены клиентом. У кого-нибудь есть идеи о том, как лучше всего это сделать?
Забавно - до использования дуплексных служб моя проблема заключалась в том, что я не мог получить данные достаточно быстро. Теперь, когда я использую дуплекс, я не могу его отключить!
1 ответ
Я могу думать о двух способах приблизиться к этому. NB: Я тоже не проверял, и, несомненно, есть другие.
(1) На клиентской или серверной стороне прервите соединение и восстановите новое. Хакерский вид, и я могу сказать по своему опыту, что кодирование вокруг такого рода соединения типа "теперь видишь, теперь нет" - это PITA.
(2) На стороне сервера, сначала отправляйте только определенный объем данных, а оставшиеся кэшируйте до тех пор, пока вы не получите от клиента уведомление о том, что вы действительно хотите увидеть следующий бит. Это будет похоже на подход, используемый многими пользовательскими интерфейсами "подкачки". Вариант этого состоит в том, чтобы ставить в очередь не данные, а звонки клиенту. Добавьте их в какую-нибудь переменную Action, поставьте их в очередь и выполните обратный вызов только после того, как клиент сказал: "Да, дайте мне следующие 50".
К сожалению, я не знаю, как сказать OperationContext: "Прервите все ожидающие вызовы, но оставьте канал живым". Может быть, оно есть, но я не смог его найти. Рад, что кто-то с большим знанием и опытом поправил меня.