Реализовать Асинхронное Тайм-аут в Silverlight? - PullRequest
2 голосов
/ 20 июня 2011

В Silverlight, скажем, мы запускаем асинхронный запрос:

var request = WebRequest.Create(uri);

и затем дождитесь ответа через делегата

request.BeginGetResponse(getResponseResult => ...

Как мы можем тайм-аут этого официанта, чтобы вместо этого доставить делегату сигнал об ошибке тайм-аута? Использовать таймер? (примечание: параметры времени ожидания, доступные в .net framework, отсутствуют в версии Silverlight).

Для обработки двух сообщений, поступающих одновременно, мы могли бы ввести фильтр Guid, а затем игнорировать второе сообщение, когда / если оно было доставлено делегату. Или наоборот (лучше), мы регистрируем истекающий Guid, чтобы делегат мог отбросить второе сообщение - тогда возможна, по крайней мере, некоторая сборка мусора (хотя объем памяти делегата должен быть небольшим).

Ниже приведены некоторые заметки, которые я сделал. Я еще не пришел к выводу. Любая помощь высоко ценится.


Моей строкой запроса было реализовать таймер, уведомить об обратном вызове, а затем каким-то образом отменить ожидание делегата в запросе. BeginGetResponse (...).

Примечание:

  • Хотя .Net Frame Work 4 реализует тайм-аут в классе WebRequest, версия Silverlight этого не делает.

  • «Метод System.Threading.Task.Wait (TimeSpan)» также недоступен

ВОПРОС 1: есть ли лучший способ реализовать ошибку тайм-аута для той же цели делегата?

ВОПРОС 2: Для отмены ожидающего делегата достаточно ли использовать «request.BeginGetResponse (null)»?

ВОПРОС 3: вызовет ли невыполненный делегат (например, getResponseResult => ...) небольшую утечку памяти? Это небольшая проблема?


Информация о создании таймера:

Некоторые ссылки:

1 Ответ

2 голосов
/ 21 июня 2011

Если вы хотите попробовать реактивные расширения, вы получите поддержку по тайм-ауту за дешевую цену.С Rx это будет выглядеть примерно так (не точный код):

var obsrv = Observable.FromAsyncPattern<...>(Begin..., End...);
obsrv(...).Timeout(new TimeSpan(0,0,5)).Subscribe(() => DoThings());
...