RX订阅后处置
Dispose after RX subscription
我有一个包含热可观察对象的 class。它进行一些图像转换并收集指标(为简单起见,示例中为 int
)
public class Provider
{
public IObservable<(int Metric, Bitmap Image)> HotObservable { get; }
public Provider()
{
HotObservable = Observable.Interval(TimeSpan.FromSeconds(5))
.Select(x => ...) // Some processing here
.Where(x => ...) // Some conditions
.Publish() // Make it hot
.RefCount(); // Stay connected while there are subscription
}
}
我想在另一个可观察对象中公开没有图像的指标:
public IObservable<int> MetricsObservable { get; } = HotObservable.Select(x => x.Metric);
问题
客户可以订阅其中任何一个,但 Bitmap
应在之后处理。
示例客户端代码:
public void SubscribeClient()
{
MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
HotObservable(x =>
{
if (x.Image.Width < 1024)
UploadImage(x.Image);
// I could dispose image here in this case
});
}
最坏情况:
public void SubscribeClient()
{
MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
// No way to dispose bitmap because it's not here
}
问题:RX 中是否可能有某种处理程序在所有订阅完成后触发?或者也许有另一种方法可以实现类似的行为?
就其本质而言,Observable
s 可以被任何客户端使用。在您的特定情况下,谁决定何时以及由谁处置资源?最坏的情况是,一个客户端会在另一个客户端被允许使用它之前处置该实例。在我看来,处理资源根本不是消费者的责任。无论订阅哪个 observable 都是如此。
在我看来,资源的发起者拥有它,在发出价值后应该注意处置它。
我有一个包含热可观察对象的 class。它进行一些图像转换并收集指标(为简单起见,示例中为 int
)
public class Provider
{
public IObservable<(int Metric, Bitmap Image)> HotObservable { get; }
public Provider()
{
HotObservable = Observable.Interval(TimeSpan.FromSeconds(5))
.Select(x => ...) // Some processing here
.Where(x => ...) // Some conditions
.Publish() // Make it hot
.RefCount(); // Stay connected while there are subscription
}
}
我想在另一个可观察对象中公开没有图像的指标:
public IObservable<int> MetricsObservable { get; } = HotObservable.Select(x => x.Metric);
问题
客户可以订阅其中任何一个,但 Bitmap
应在之后处理。
示例客户端代码:
public void SubscribeClient()
{
MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
HotObservable(x =>
{
if (x.Image.Width < 1024)
UploadImage(x.Image);
// I could dispose image here in this case
});
}
最坏情况:
public void SubscribeClient()
{
MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
// No way to dispose bitmap because it's not here
}
问题:RX 中是否可能有某种处理程序在所有订阅完成后触发?或者也许有另一种方法可以实现类似的行为?
就其本质而言,Observable
s 可以被任何客户端使用。在您的特定情况下,谁决定何时以及由谁处置资源?最坏的情况是,一个客户端会在另一个客户端被允许使用它之前处置该实例。在我看来,处理资源根本不是消费者的责任。无论订阅哪个 observable 都是如此。
在我看来,资源的发起者拥有它,在发出价值后应该注意处置它。