订阅/重新订阅可观察流

时间:2016-02-03 15:54:07

标签: c# system.reactive reactive-programming

我遇到了一个问题,我想在谓词为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#中的事件处理程序)

感谢您提前帮助

2 个答案:

答案 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倍速)以获得完整的上下文。