Phương tiện mở rộng được trả về bằng phương pháp mở rộng Subscribe
chỉ được trả lại để cho phép bạn hủy đăng ký theo cách thủ công từ quan sát trước kết thúc tự nhiên có thể quan sát được.
Nếu có thể quan sát được - với OnCompleted
hoặc OnError
- thì đăng ký đã được xử lý cho bạn.
Hãy thử mã này:
var xs = Observable.Create<int>(o =>
{
var d = Observable.Return(1).Subscribe(o);
return Disposable.Create(() =>
{
Console.WriteLine("Disposed!");
d.Dispose();
});
});
var subscription = xs.Subscribe(x => Console.WriteLine(x));
Nếu bạn chạy ở trên, bạn sẽ thấy rằng "xử lý!" được ghi vào bàn điều khiển khi có thể quan sát được mà không cần bạn gọi số .Dispose()
khi đăng ký.
Một điều quan trọng cần lưu ý: các bộ thu rác không bao giờ gọi .Dispose()
trên đăng ký quan sát được, vì vậy bạn phải vút của đăng ký của bạn nếu họ không có (hoặc không có) đã kết thúc một cách tự nhiên trước khi thuê bao của bạn đi ra khỏi phạm vi.
Đi này, ví dụ:
var wc = new WebClient();
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h);
var subscription =
ds.Subscribe(d =>
Console.WriteLine(d.EventArgs.Result));
Các ds
thể quan sát được sẽ chỉ gắn với xử lý sự kiện khi nó có một thuê bao và sẽ chỉ tách khi chạy xong quan sát hoặc đăng ký sẽ được xử lý. Vì nó là một trình xử lý sự kiện quan sát được sẽ không bao giờ hoàn toàn bởi vì nó đang chờ đợi sự kiện hơn, và do đó xử lý là cách duy nhất để tách từ sự kiện này (đối với ví dụ trên).
Khi bạn có một FromEventPattern
thể quan sát được mà bạn biết sẽ chỉ bao giờ trả lại một giá trị thì nó là khôn ngoan để thêm phương pháp .Take(1)
phần mở rộng trước khi đăng ký để cho phép xử lý sự kiện để tự động tách và sau đó bạn không cần phải tự định đoạt đăng ký.
Giống như vậy:
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h)
.Take(1);
Tôi hy vọng điều này sẽ giúp.
IMHO thực tế là một đối tượng xử lý là trong phạm vi làm cho nó một phong cách xấu. Tui bỏ lỡ điều gì vậy? –
Bằng cách này, bạn có nghĩa là biến "dùng một lần" có thể được xử lý nếu cháy MyObservable trước khi biến dùng một lần đi ra khỏi phạm vi? Một mô hình tốt hơn để xử lý đối tượng này là gì? – Noob