2012-09-18 47 views
4

我试图总结我的周围RX而是介于头我的大脑爆炸:)RX,重试,允许处理异常

我试图做的是通过RX异步方式调用一个WCF方法。 这里没什么特别的,但是当WCF方法抛出一个错误时,我想重新创建通道并给它另一个去(最多3次)。

我至今是:

var _sc = new Service.Service1Client(); 
var _observableFunc = Observable.FromAsyncPattern<int, string>(_sc.BeginGetData, _sc.EndGetData); 
var _observable = _observableFunc(666); 

var _defered = Observable.Defer(() => _observable); 

// Here something should be done, but don't know what... 

using (_retryable.Subscribe(x => Console.WriteLine("Async ==> '{0}'", x), 
          ex => Console.WriteLine("Oops ==> {0}", ex.Message))) 
{ 
    Console.ReadLine(); 
} 

Catch<TSource, TException>发挥各地,这让我捕获异常,并继续使用相同的观察到的,因此给我我想要的东西。 唯一的问题是它永远运行,这意味着如果我继续抛出异常,那么这个东西永远都不会停止!

+1

看看Observable.Retry是否有帮助。另外,如果你刚刚开始使用RX并且你的大脑没有受到伤害,那么你做错了;-) –

+0

对我的大脑,但它的伤害比昨天少伤害:) 我发现了已经重试但问题是我的“热”可观察性仍然“热,我没有得到完全的Defer语法的点 –

回答

1

尝试这样做:

var retryable = Observable.Defer(() => _observableFunc(666).Retry(3)); 

Retry扩展方法“重复源可观察序列中的指定的次数或直到它成功终止”。

而且,不这样做:

var _observable = _observableFunc(666); 
var _defered = Observable.Defer(() => _observable); 

有没有点推迟观察到你踢它关闭之后。

你应该这样做,而不是:

var _defered = Observable.Defer(() => _observableFunc(666)); 

然后你只差一步就只能从我在上面建议解决方案。

+0

是的,我昨天发现它,就像”啊,现在有道理“。发布我做错了,但你的答案解释了这一切。 thnx反正! –