2012-09-18 83 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反正! –