我遇到了一个问题,我想在谓词为true时订阅一个可观察的流,并在谓词为false时停止订阅。当未来某个时间点的谓词再次成立时,它应该重新订阅可观察流。
我有可观察的流作为输入(IObservable<IList<LogEntity>> items
)如果我无法将日志实体插入数据库,它应该取消订阅流,并且当数据库备份运行时它应该自动订阅流(基于属性IsSubscribed
)并开始插入数据。
我已经尝试过以下 DID NOT 工作:
var groups = from dataItem in items.SelectMany(o => o.GroupBy(i => i.EntityType))
where dataItem.Any()
select new {Type = dataItem.Key, List = dataItem.Select(o => o)};
groups
.TakeWhile(o => IsSubscribed)
.SubscribeOn(_scheduler)
.Repeat()
.Subscribe(o => Insert(o.Type, o.List));
根据属性IsSubscribed
,我想要流式订阅和取消订阅。 TakeWhile
为真时OnCompleted
被调用,Subscribe
之后无法工作。 旁注:这是一个冷的可观察流
如何创建一个可观察的流,我可以根据需要订阅和取消订阅多次(有点像C#中的事件处理程序)
感谢您提前帮助
答案 0 :(得分:1)
你想要的是添加 组 .Delay(group.SelectMany(WaitForDatabaseUp))
public async Task WaitForDatabaseUp()
{
//If IsSubscribed continue execution
if(IsSubscribed) return;
//Else wait until IsSubscribed == true
await this.ObservableForProperty(x => x.IsSubscribed, skipInitial: false)
.Value()
.Where(isSubscribed => isSubscribed)
.Take(1);
}
使用您喜欢的框架将INPC转换为Observable,您可以在其中看到ObserveProperty()
基本上我们将内联一个只在IsSubscribed == true
时返回的任务。然后将该任务转换为Observable,以便与Rx兼容。
答案 1 :(得分:1)
看起来像是一个重复的问题。
但是,从Pimpl idiom中提取代码,可以将其调整为
{{1}}
你可以看到Matt Barrett(和我)谈论它Pause and Resume Subscription on cold IObservable。我建议观看整个视频(可能是2倍速)以获得完整的上下文。