2012-08-02 3 views
0

I는 다음과 같습니다 F # 코드가 있습니다자기 오류에 의존하는 자기 처리

serve' : int -> IObservable<Socket> 
c   : Socket 
RSS.items : IObservable<XElement> 
bytes  : XElement -> byte [] 
c.SendAll : byte [] -> unit 
  • 가 가장 관용적 인 방법은 무엇입니까

    module O = Control.Observable 
    //... 
    use ss = serve' 4000 
         |> O.subscribe 
          (fun c -> use cs = RSS.items 
               |> O.subscribe (bytes >> c.SendAll) |> ignore) 
    

    c.SendAll이 실패 할 때까지 cs을 유지 하시겠습니까?

  • 정의 할 수 있습니까? Observable.subscribeUntilError(action)action에 실패하면 구독이 삭제됩니다. 그렇지 않은 경우 IObservable이 계속 푸시되는 한 action이 실행됩니까?
+2

관찰 항목이 "OnComplete"또는 "OnError"로 완료되면 구독이 자동으로 삭제됩니다. 조기 종료를 원하면 구독을 처분해야합니다. – Enigmativity

+0

@Enigmativity 아, 명시 적으로 처리하지 않았지만 범위를 벗어난 경우에만 처리 ​​할 수 ​​있습니까? 왜'ignore'가 가비지 콜렉션에 남겨 두지 않는지, 왜 위 코드가 작동하는지 설명 할 수 있습니다. –

+0

그들은 마치 .NET 객체와 같습니다. 범위를 벗어나서 참조가 남아 있지 않으면 GC'ed됩니다. – Enigmativity

답변

0

나는이 함께 올라와있다 :

let inline Δ<'a> = Unchecked.defaultof<'a> 
let inline LOG x = printf "%A" x 

module O = Observable 
    let d = ref (Δ:IDisposable) 
    let b x = try a x with e -> LOG e; let s = !d in if s <> Δ then s.Dispose() 
    d := o |> O.subscribe b 
    { 
    new IDisposable with 
     member x.Dispose() = let s = !d in if s <> Δ then d := Δ; s.Dispose() 
    } 

main에 시도의 차이를 설명하기 위해!

subscribe 사용 :

use s = new Subject<int>() 
use x = s |> O.subscribe (fun _ -> raise <| Exception()) 
use y = s |> O.subscribe (printf "%i") 
s.OnNext 20 

응용 프로그램이 무너지는 온다 :

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was thrown. 
    at Microsoft.FSharp.Core.Operators.Raise[T](Exception exn) 
    at [email protected](Int32 _arg1) in C:\Eniox\Eniox.News.Google\Eniox.News.Google\Program.fs:line 60 
    at [email protected]1915.System-IObserver`1-OnNext(T value) 
    at System.Reactive.Observer`1.OnNext(T value) 
    at System.Reactive.Subjects.Subject`1.OnNext(T value) 
    at Program.System.main(String[] args) in C:\Eniox\Eniox.News.Google\Eniox.News.Google\Program.fs:line 606 

지금 사용 subscribeUE :

use s = new Subject<int>() 
use x = s |> O.subscribeUE (fun _ -> raise <| Exception()) 
use y = s |> O.subscribe (printf "%i") 
s.OnNext 20 

은 구독 x을 기쁜 마음으로 처분하고 딸꾹질없이 응용 프로그램을 계속 실행하며 정상적으로 종료됩니다!LOG = ignore와 출력 :

20 

내가이 콤비가 생략 너무 유용하다는 것을 발견하면 유사한 기능이 실제로 RX 2.0 어딘가에 존재하는지 여부를 알고 싶어요.