C# Reactive Extensions - 我应该 return 一次性的吗?
C# Reactive Extensions - Should I return a disposable?
我试图了解什么时候是 return 传递给 Observable.Create
的函数中的一次性资源的好时机,而不是仅通过 using
语句通过范围处理任何资源。
在 Observable
是无限流的情况下,return 是否需要更多的一次性用品?即使这样,我也不明白 using
块如何在流过早关闭的情况下仍不会处置资源
我认为 Observable 范例上的 Disposable 接口仅用于摆脱订阅的目的(即停止对观察到的事件的回调),正如 Theodor Zoulias 指出的那样。它不管理流上的任何资源。您可能会混淆 Disposable 接口在其他场景中的使用。
关于处理订阅:
我可以看到返回 Disposable 的一个用例是当你有多个要调用该函数时:假设你有一个 Observable 列表,你可以迭代它并调用函数 .Dispose () 一次取消多个订阅。
您还可以将该流作为一次性对象传递给另一个 Observable,以便在某些事件发生时进行处理。由于整个 RX 范式是关于不知道什么时候会执行的,这很有趣。我在一个应用程序中工作,如果某个事件发生,我必须取消订阅,并且我将 Observable 订阅 (IDisposable) 传递给了 event/stream.
的观察者
这些行的内容:
IDisposable subscription1 = observableOne.Subscribe(_ => # code omitted);
observableTwo.Subscribe(_ => {
subscription1?.Dispose();
subscription1 = null;
});
正如 Enigmaticy 所指出的,虽然这体现了我的观点,但实现这一点的更好方法是:
observableOne.TakeUntil(observableTwo).Subscribe(_ => #code ommited);
我有一段时间没有使用 C#,但这些是我可以看到的使用 vs Disposable 作为对象的用例。它使您可以更灵活地决定何时取消订阅:~
感谢在此 post 中回复的每个人,它帮助我更好地理解了一点。我对 RX 的理解有很多绊脚石,我认为其中很多都归结为有限的文档,而且似乎很多在线人也不太理解,所以有很多错误信息需要整理。
这个其他答案对我有用
.
真正归结为当我们的 Observable.Create
方法中有非阻塞代码时。因此,当我们的 observable 被订阅时,我们立即 return 一个一次性的,它可以在我们需要提前取消订阅的情况下清理任何异步/并发进程。
对于您的可观察对象可能正在使用其他异步(基于推送)代码的情况,这是必要的。
对于您只想基于推送的迭代(基于拉)代码,您可以使用 Observable.Create
,但我认为仅使用 Iterator 更好,如果您需要它是推送-基于 API 然后只需使用 ToObservable
.
我试图实现一个基于推送的迭代器,所以一次性对我来说似乎是多余的,这让我感到困惑。从那以后,我将我的代码重构为基于拉的代码,如果我需要它再次基于推,我将只使用 ToObservable
.
我试图了解什么时候是 return 传递给 Observable.Create
的函数中的一次性资源的好时机,而不是仅通过 using
语句通过范围处理任何资源。
在 Observable
是无限流的情况下,return 是否需要更多的一次性用品?即使这样,我也不明白 using
块如何在流过早关闭的情况下仍不会处置资源
我认为 Observable 范例上的 Disposable 接口仅用于摆脱订阅的目的(即停止对观察到的事件的回调),正如 Theodor Zoulias 指出的那样。它不管理流上的任何资源。您可能会混淆 Disposable 接口在其他场景中的使用。
关于处理订阅:
我可以看到返回 Disposable 的一个用例是当你有多个要调用该函数时:假设你有一个 Observable 列表,你可以迭代它并调用函数 .Dispose () 一次取消多个订阅。
您还可以将该流作为一次性对象传递给另一个 Observable,以便在某些事件发生时进行处理。由于整个 RX 范式是关于不知道什么时候会执行的,这很有趣。我在一个应用程序中工作,如果某个事件发生,我必须取消订阅,并且我将 Observable 订阅 (IDisposable) 传递给了 event/stream.
的观察者这些行的内容:
IDisposable subscription1 = observableOne.Subscribe(_ => # code omitted);
observableTwo.Subscribe(_ => {
subscription1?.Dispose();
subscription1 = null;
});
正如 Enigmaticy 所指出的,虽然这体现了我的观点,但实现这一点的更好方法是:
observableOne.TakeUntil(observableTwo).Subscribe(_ => #code ommited);
我有一段时间没有使用 C#,但这些是我可以看到的使用 vs Disposable 作为对象的用例。它使您可以更灵活地决定何时取消订阅:~
感谢在此 post 中回复的每个人,它帮助我更好地理解了一点。我对 RX 的理解有很多绊脚石,我认为其中很多都归结为有限的文档,而且似乎很多在线人也不太理解,所以有很多错误信息需要整理。
这个其他答案对我有用 .
真正归结为当我们的 Observable.Create
方法中有非阻塞代码时。因此,当我们的 observable 被订阅时,我们立即 return 一个一次性的,它可以在我们需要提前取消订阅的情况下清理任何异步/并发进程。
对于您的可观察对象可能正在使用其他异步(基于推送)代码的情况,这是必要的。
对于您只想基于推送的迭代(基于拉)代码,您可以使用 Observable.Create
,但我认为仅使用 Iterator 更好,如果您需要它是推送-基于 API 然后只需使用 ToObservable
.
我试图实现一个基于推送的迭代器,所以一次性对我来说似乎是多余的,这让我感到困惑。从那以后,我将我的代码重构为基于拉的代码,如果我需要它再次基于推,我将只使用 ToObservable
.