2014-06-20 11 views
7

Tôi đang sử dụng Extensions Reactive (Rx) Theo như một sự thay thế trực tiếp cho C# môn thi đấu như vậy:Tôi có nên gọi Dispose trên Reactive Extensions (Rx) Theo <T>

public class MyClass 
{ 
    private Subject<string> subject; 

    public IObservable<string> WhenSomethingHappened 
    { 
     get { return this.subject.AsObservable(); } 
    } 

    private void OnSomethingHappened(string something) 
    { 
     this.subject.OnNext(something); 
    } 
} 

Lưu ý rằng tôi không bao giờ gọi OnCompleted trên môn học của tôi. MyClass có nên triển khai IDisposable và gọi this.subject.Dispose không? Điều này có nghĩa là bất kỳ việc triển khai nào sử dụng Subject đều phải thực hiện IDisposable.

Lý do tôi hỏi là mẫu IDisposable hơi giống một căn bệnh, nếu một thứ thực hiện nó, mọi thứ sử dụng nó cũng phải thực hiện nó.

+1

MyClass và chủ đề sẽ "sống" trong toàn bộ vòng đời của ứng dụng? Bạn có muốn hủy đăng ký các nhà quan sát khỏi nó không? – vvv

+0

Có trong trường hợp của tôi. –

Trả lời

10

Không, bạn thực sự không cần thực hiện việc này. Khi lo lắng về việc sử dụng bộ nhớ và thời gian sống, hãy suy nghĩ về việc xử lý Đăng ký, không phải Chủ đề.

+4

Nếu bạn xem mã nguồn của Chủ đề (https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Linq/Reactive/Subjects/Subject.cs) bạn có thể thấy tất cả nó thay thế bất kỳ người quan sát nào với một cá thể DisposedObserver. Điều này sau đó sẽ ném nếu chủ đề có bất kỳ sự kiện nào được ném vào nó. Vì vậy, về mặt kỹ thuật tôi nghĩ rằng nó sẽ phát hành tài liệu tham khảo cho tất cả các nhà quan sát, nhưng điều đó thực sự nên được thực hiện bằng cách xử lý các đăng ký của bạn như Paul nói trên –

+0

Câu trả lời và nhận xét tốt. Có một cuộc bỏ phiếu. Nếu bạn đang triển khai IDisposable thì sao? Dường như có rất nhiều đối tượng mà thực hiện IDisposable nhưng nó được khuyến cáo rằng họ không bao giờ xử lý. HttpClient mới là một ví dụ khác. –

Các vấn đề liên quan