2013-02-11 2 views
2

Я делаю наблюдаемый из AsyncPattern, который я хочу отслеживать с интервалами. До сих пор я должен здесь:Обработка таймаута изящно на Observable.FromAsyncPattern

var observer = Observable.Defer(ObservableFunc) 
    .Concat(Observable.Empty<int>().Delay(TimeSpan.FromSeconds(_pollInterval))) 
    .Timeout(TimeSpan.FromSeconds(_Timeout_s)) 
    .Materialize() 
    .Repeat() 
    .Publish() 
    .RefCount(); 
  • Не опрашивать пока кто выписывает (Defer)
  • повторного опроса данное время после последнего ответа (а не только keep blindly polling) (Concat/Delay)
  • Detect, если опрос не истекло (нет ответа) (Timeout)
  • Start снова, если он делает тайм-аут (Repeat)
  • Не переадресовывайте for new subscribers, прекратите опрос, когда абонентов больше нет (Publish/RefCount).

Мой вопрос об Materialize посередине. Это (для меня), кажется, довольно элегантный способ позволить TimeoutException «пройти», чтобы подписчики могли узнать об этом. Я просто не уверен, должен ли я позволить ему вести себя как Notification, или, возможно, переделать его в какой-то вид Maybe/Nullable T.

ответ

1

Это не может «претендовать» в качестве ответа, но, вероятно, слишком долго для комментария ... Вздох

Моя кишка говорит: распространение информации о тайм-аут, как Maybe/Nullable.

Рассуждение:

  • Вероятно, ни один подписавшись на это не волнует, что причина его не в состоянии произвести значение было, они просто заботятся о том, что следующее значение было недоступно по какой-то причине. (Конечно, я делаю много предположений здесь)

Чтобы капельку, я бы следовать Timeout звонку с Catch что бы впрыснуть/вернуть «нулевое значение» (определяемое как бы вы хотели - Maybe, Nullable<T> и т. Д.), Что делает «форму» результирующего потока более понятным для всех подписчиков.

+0

Возможно (: P) не ответ, но выглядит хорошо для меня. Я коротко посмотрел на «Поймать», но не смог определить, какой Observable дать в качестве аргумента. Я забыл о 'Observable.Return' ... – Benjol

+0

@Benjol Да, я на самом деле использовал этот подход на этом SO-ответ: http://stackoverflow.com/questions/14782742/reactive-subscription-to-event-not- прослежены по-разному-событийно-в-период-O/14785323 # 14785323 – JerKimball

Смежные вопросы