나는이 함께 올라와있다 :
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 어딘가에 존재하는지 여부를 알고 싶어요.
관찰 항목이 "OnComplete"또는 "OnError"로 완료되면 구독이 자동으로 삭제됩니다. 조기 종료를 원하면 구독을 처분해야합니다. – Enigmativity
@Enigmativity 아, 명시 적으로 처리하지 않았지만 범위를 벗어난 경우에만 처리 할 수 있습니까? 왜'ignore'가 가비지 콜렉션에 남겨 두지 않는지, 왜 위 코드가 작동하는지 설명 할 수 있습니다. –
그들은 마치 .NET 객체와 같습니다. 범위를 벗어나서 참조가 남아 있지 않으면 GC'ed됩니다. – Enigmativity