В 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 => ...) небольшую утечку памяти? Это небольшая проблема?
Информация о создании таймера:
Некоторые ссылки: