티스토리 뷰

카테고리 없음

[씨#] 동적 Observable 구독 취소

필살기쓰세요 2021. 2. 9. 03:39

문제를 더 깊이 파고 드는 동안 가능한 3 가지 해결책을 찾았습니다.

  1. 특정 경우에 Disposed대해 다음과 같이 컨트롤의 이벤트를 사용할 수 있습니다 .

    var incsFromWidgets = addCounterStream
                .SelectMany(x => Observable.FromEventPattern(x, "Increment")
                            .Select(_ => 1)
                                        .TakeUntil(Observable.FromEventPattern(x, "Disposed").Take(1)))
                                                .Publish();
                                                
  2. 실제로는 첫 번째 방법의 일반화입니다. 다음과 같이 릴리스 의미 체계를 사용하여 일반 래퍼 클래스를 만들 수 있습니다.

    class Wrapper<T> : IDisposable {
            public T Value { get; set; }
                public event EventHandler Disposed;        
                }
                
  3. 스트림의 수동 "게양":

    // declare all streams
        IObservable<int> aStream = null;
        IObservable<bool> bStream = null;
        IObservable<MyWidget> cStream = null;
        
        // then compose it
        aStream = Observable.From(...).TakeUntil(bStream.Where(...));
        bStream = Observable.From(...).CombineLatest(aStream, ...);  // cyclic dependency
        

세 번째 방법은 끔찍해 보일 수 있지만 다양한 방식으로 스트림을 결합 할 수있는 큰 가능성을 제공합니다.주의해야하며 무한 재귀를 생성하지 마십시오.

편집 : 글쎄, 실제로 세 번째 방법은 그렇게 간단하지 않으며 스트림이 아래에 정의되어 있더라도 NullReferenceException을 throw합니다. 적절한 구현은 다음과 같습니다.

        IConnectableObservable<int> a = null;
        IConnectableObservable<char> b = null;
                IConnectableObservable<bool> c = null;            
                
                        a = Observable.Defer(() => b.Select(x => (int)x)).Publish();
                                b = Observable.Defer(() => Observable.Generate('A', x => x < 255, x => (char)(x + 1), x => x).TakeUntil(c)).Publish();
                                        c = Observable.Defer(() => a.SkipWhile(x => x < 70).Select(_ => true)).Publish();
                                        
                                                a.Subscribe(x => Console.WriteLine($"from a: {x}"));
                                                        b.Subscribe(x => Console.WriteLine($"from b: {x}"));
                                                        
                                                                c.Connect();
                                                                        a.Connect();
                                                                                b.Connect();
                                                                                
                                                                                        Console.ReadKey(true);
                                                                                        


출처
https://stackoverflow.com/questions/39929998
댓글
공지사항
Total
Today
Yesterday
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31