我想用Rx異步處理一些任務,例如:如何在SelectMany語句中處理來自異步方法的異常
var list = Enumerable.Range(0, 100)
.ToObservable()
.SelectMany(x => Observable.Start(() => {
Console.WriteLine("Processing {0} ...", x);
Thread.Sleep(100 * x % 3);
if (x > 90) {
Console.WriteLine("Procesing exception {0} > 90", x);
throw new Exception("Value too large");
}
Console.WriteLine("Processing {0} completed.", x);
return x;
}))
.Subscribe(
x => { Console.WriteLine("Next [{0}]", x); },
e => {
Console.WriteLine("Exception:");
Console.WriteLine(e.Message);
},
() => { Console.WriteLine("Complete"); }
);
這個代碼的問題是,異常不會傳遞給訂閱者。因此,在經過大量嘗試之後,我放棄了並決定問這個簡單的問題:
如何處理在SelectMany
語句中異步方法中引發的異常?
只是要說清楚,最終的實現是一個同步函數調用,可能會或可能不會拋出異常。目標是將其傳遞給用戶,以便可以進一步處理(在特定情況下會向用戶顯示一條消息)。
編輯
我感動我的調查結果下降到答案,所以,當我回答可以標記這個問題。就我個人而言,我不同意自己的回答......但有時候沒有別的辦法,所以很抱歉。
這是否有助於回答您的問題? http:// stackoverflow。com/questions/7210051/catch-exceptions-which-may-be-thrown-a-subscription-onnext-action – user981225 2012-03-05 22:46:25
不完全如此壓倒例外,但是,如果沒有更好的東西進來,那麼這個轉移想法可能是有用的。但是,我不確定包裝是否會在我的情況下工作,因爲我正在處理多個異步和並行呼叫......但我會調查,謝謝。 – AxelEckenberger 2012-03-05 23:16:41
@ user981225,謝謝你的寶貴意見,但答案很簡單,請參閱編輯。 – AxelEckenberger 2012-03-06 11:28:35