退回的一次性用品Subscribe
返回扩展方法只是为了允许您手动取消订阅可观察的before可观察的自然结束。
如果可观察完成 - 使用任一OnCompleted
or OnError
- 那么订阅已经为您处理完毕。
试试这个代码:
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));
如果您运行上面的命令,您将看到“已处理!”当可观察完成时写入控制台,无需调用.Dispose()
关于订阅。
需要注意的一件重要事情:垃圾收集器从不调用.Dispose()
在可观察的订阅上,所以你must如果您的订阅在您的订阅超出范围之前尚未(或可能尚未)自然结束,请处置您的订阅。
以此为例:
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));
The ds
observable 仅在具有订阅时才会附加到事件处理程序,并且仅在 observable 完成或订阅被释放时才会分离。由于它是一个事件处理程序,可观察对象永远不会完成,因为它正在等待更多事件,因此处置是与事件分离的唯一方法(对于上面的示例)。
当你有一个FromEventPattern
observable ,你知道只会返回一个值,那么明智的做法是添加.Take(1)
在订阅之前添加扩展方法以允许事件处理程序自动分离,然后您无需手动处置订阅。
Like so:
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h)
.Take(1);
我希望这有帮助。